一个简易聊天工具,测试都还Ok,就是在控制台输入中文的时候会带拼音,有没有技术大佬能指正,没有分数了,只能这么点了~客户端
public class Client {
private Socket client;
public Client() {
try {
client=new Socket("localhost",8088);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
GetServerInfoHandler handler=new GetServerInfoHandler(client);
Thread thread=new Thread(handler);
thread.setDaemon(true);
thread.start();
try {
PrintWriter writer=new PrintWriter(client.getOutputStream());
System.out.println("请输入你的昵称(不少于2位):");
Scanner sc=new Scanner(System.in);
String nickName="";
while(nickName.length()<2){
System.out.println("请输入你的昵称:");
nickName=sc.nextLine().trim();
}
System.out.println("你好!"+nickName+"可以聊天啦");
while(true){
System.out.println(nickName+":"+sc.nextLine());
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
class GetServerInfoHandler implements Runnable{
private Socket socket;
public GetServerInfoHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader=new BufferedReader(
new InputStreamReader(socket.getInputStream()));
while(true){
System.out.println(reader.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client().start();
}}
服务端
public class Server {
private ServerSocket server;
private ExecutorService threadPool;
private Vector<PrintWriter> allOut;
private BlockingQueue<String> messageQueue;
public Server() {
try {
server=new ServerSocket(8088);
threadPool=Executors.newCachedThreadPool();
allOut=new Vector<PrintWriter>();
messageQueue=new LinkedBlockingQueue<String>();

} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
try {
SendMsgToAllClientHandler sendThread=new SendMsgToAllClientHandler();
Thread thread=new Thread(sendThread);
thread.setDaemon(true);
thread.start();
while(true){
System.out.println("等待客户端连接");
Socket socket=server.accept();
System.out.println("一个客户端连接。。");
ClientHandler handler=new ClientHandler(socket);
threadPool.execute(handler);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public class ClientHandler implements Runnable{
private Socket client;
public ClientHandler(Socket client) {
this.client = client;
}
public void run() {
PrintWriter writer=null;
try {
writer=new PrintWriter(client.getOutputStream());
allOut.add(writer);
BufferedReader reader=new BufferedReader(
new InputStreamReader(client.getInputStream()));
while(true){
messageQueue.offer(reader.readLine(),5,TimeUnit.SECONDS);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
synchronized (allOut) {
allOut.remove(writer);
} }
}
}
class SendMsgToAllClientHandler implements Runnable{
public void run() {
while(true){
if(messageQueue.peek()!=null){
String str=messageQueue.poll();
synchronized (allOut) {
for(PrintWriter writer:allOut){
writer.println(str);
writer.flush();
}

}
}
try {
if(messageQueue.size()==0){
Thread.sleep(250);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Server server=new Server();
server.start();
}
}控制台技术java聊天工具测试

解决方案 »

  1.   

    话说,想模仿多线程的么?要继承Thread或者实现Runnable,你这直接写了个start方法,没有多线程的效果的。。
      

  2.   

    一个正常的聊天工具应该不会受输入法的限制的吧
    看你的截图你用的是Eclipse中的Console做的输入,用这个的确会有限制.
      

  3.   

    这样做也太不符合日常操作了,你跟别人聊天会先在记事本写好,然后一句句CV大法挪到聊天框么
    这个我以前也做过,遇到跟你的问题是一样的。你可以自己做一个聊天框,别在控制台输入就好了。现在也没有聊天软件是用控制台输入聊天的你说是吧
    看来是我太高估了java控制台的功能啦当然,现在的聊天工具都是有自己的聊天框的
      

  4.   

    一个正常的聊天工具应该不会受输入法的限制的吧
    看你的截图你用的是Eclipse中的Console做的输入,用这个的确会有限制.
    好吧,之前不知道,现在知道了又想起前人说的话,java的控制台做的真是不咋地
      

  5.   

    建议楼主去看下Swing,然后找个文本框,找个按钮,会比控制台好很多。出现英文就是因为输入法的问题,我以前遇到过。可以在有聊天信息来的时候弹出一个文本框,也可以接收输入。没学过Swing.代码搞不了,估计也不难。加油