看了两天socket通信,也参考了网上其他人是怎么写的。
下面我把最简单的socket例程贴出来
server代码:
public class Server { private static int port = 8888; private static ServerSocket serverSocket; private static Socket socket; public static void main(String args[]) throws IOException { serverSocket = new ServerSocket(port, 2); socket = serverSocket.accept(); System.out.println("客户端已链接"); DataInputStream dis = new DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF("来自服务器的消息"); while (true){ /* //读取客户端发送的信息 String str = dis.readUTF(); System.out.println("From 客户端:"+str); if(str.equals("bye")){ socket.close(); serverSocket.close(); break; } */ // 发送键盘输入的一行 String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); dos.writeUTF(s); } } }
Client代码:
public class Client { private static int port = 8888; private static String host = "localhost"; private static Socket socket; public static void main(String args[]) throws UnknownHostException, IOException { socket = new Socket(host, port); DataInputStream dis = new DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF("来自客户端的消息"); while(true){ //读取服务器发送的信息 String str = dis.readUTF(); System.out.println("From 服务器:"+str); if(str.equals("bye")){ socket.close(); System.out.println("关闭socket"); break; } // 发送键盘输入的一行 //String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); //dos.writeUTF(s); } } }
因为readLine()是一个阻塞函数,接收不到消息会阻塞在那里。如果把两个文件中的注释去掉后,服务器和客户端必须你一句我一句,才能正常通信。目前还没有解决办法。
所以,先实现单向通信:server发送数据,client接收数据。