利用 socket 模拟qq 的消息发送和接收功能。既可以接收消息,也可以发送消息,无论是server 还是 client。在server 和 client 端都开启了两个线程, 一个线程用于接收并打印消息,一个线程用于发送消息。
先启动 server ,后启动client 去连接server, client 端抛出异常,说, socket 获取outputStream失败。。找不到原因啊。。oh。 求高手解答。
package com.corejava.chapter3;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class AnalogQQClient
{
public static void main(String[] args) throws IOException
{
try(Socket socket = new Socket("127.0.0.1", 8189))
{
new Thread(new Runnable() // print server's info
{
@Override
public void run()
{
try
{
Scanner scanner = new Scanner(socket.getInputStream());
while(true)
{
if(scanner.hasNext())
{
String line = scanner.nextLine();
System.out.println("from client: " + line);
if(line.equals("bye"))
{
break;
}
}
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() // send info typed to the server
{
@Override
public void run()
{
try
{
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
while(true)
{
Scanner scanner = new Scanner(System.in);
if(scanner.hasNext())
{
writer.println("from server: " + scanner.nextLine());
}
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}).start();
}
finally
{
System.out.println("the client is closed !");
}
}
}
package com.corejava.chapter3;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class AnalogQQServer
{
public static void main(String[] args) throws IOException
{
try(ServerSocket serverSocket = new ServerSocket(8189))
{
Socket socket = serverSocket.accept();
new Thread(new Runnable() // print client's info
{
@Override
public void run()
{
try
{
Scanner scanner = new Scanner(socket.getInputStream());
while(true)
{
if(scanner.hasNext())
{
String line = scanner.nextLine();
System.out.println("from client: " + line);
if(line.equals("bye"))
{
break;
}
}
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() // send info typed to the client
{
@Override
public void run()
{
try
{
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
while(true)
{
Scanner scanner = new Scanner(System.in);
if(scanner.hasNext())
{
writer.println("from server: " + scanner.nextLine());
}
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}).start();
}
finally
{
System.out.println("the server is closed !");
}
}
}
分析了下你的代码,根本原因是你用了jdk1.7的try()操作,将客户端的Socket写在try()后面了,导致启动的两个线程还在使用socket时,jdk已经自动将该socket关闭了。
修改方法很简单,将Client端的try()括号里面的代码挪到{}中,然后使用完成后手动关闭。
try {
Socket socket = new Socket("127.0.0.1", 8189);
这样修改后就可以正常通信了,但是你的通信终止操作还需要再设计下,因为你是开启了多个线程来通信的,怎么让客户端在收到bye的消息后也终止发送呢?
这个我觉得你还需要认真思考下。祝好,有问题再交流。