ServerSocket和Socket通讯实例

来源:互联网 发布:网络空间 概念股 编辑:程序博客网 时间:2024/06/05 04:22

        整理了JAVA 网络编程的一个“对讲机”式的小实例,采取“一问一答”的方式。首先简介ServerSocket 和 Socket 通讯的过程,下面是一张Socket通信模型的图片。


            ServerSocket ss = new ServerSocket(9999);

           Socket s1 =  ss.accept();

            首先,服务器在本机 9999 端口监听,等待客户端的连接。

           Socket s2 = new Socket("127.0.0.1",9999);

           此时,Socket s2 尝试连接本机的 9999 端口,建立一个通讯的“道路”。

           接下来,通过Socket,使用输入输出流发送或接收数据。通讯结束后,关闭Socket连接和各类流。


          以下是代码:

          

import java.net.*;import java.io.*;import java.util.*;/** * @name 服务端 * @author chenyongjun * @time 2013-03-23 * */public class Server {public static void main(String [] args){try {ServerSocket serverSocket = new ServerSocket(8888);     // 服务端在本机 8888 端口监听System.out.println("服务器在 8888 端口监听...");Socket socket = serverSocket.accept();                       // 等待客户端连接System.out.println("客户端成功连接服务器...");// 获取输入输出流PrintWriter sendMesToClient = new PrintWriter(socket.getOutputStream(),true);BufferedReader readMesFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader readMesFromConsole = new BufferedReader(new InputStreamReader(System.in));// 进行“对讲机”式通讯while (true){String mesFromClient = readMesFromClient.readLine(); // 读取来自客户端的消息System.out.println("客户端说:" + mesFromClient);     // 将读取的消息显示在控制台// 如果客户端说 "bye",结束通话,关闭各类流和Socket,结束 while()循环if (mesFromClient.equals("bye")){    System.out.println("通话结束!");    readMesFromClient.close();    sendMesToClient.close();    readMesFromConsole.close();    socket.close();break;    }// 向客户端发送消息System.out.println("请输入你想对客户端说的话");String mesFromConsole = readMesFromConsole.readLine();   // 从控制台输入要发送的消息sendMesToClient.println(mesFromConsole);                 // 向客户端发送消息sendMesToClient.flush();                                  }} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

import java.io.*;import java.net.*;public class Client extends Thread{public static void main(String[] args) {try {Socket socket = new Socket("127.0.0.1",8888);   // 连接本机 8888 端口上的服务器// 获取输入输出流BufferedReader readMesFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter sendMesToServer = new PrintWriter(socket.getOutputStream());BufferedReader readMesFromConsole = new BufferedReader(new InputStreamReader(System.in)); // 进行“对讲机”式通讯while(true){// 向服务器发送消息System.out.println("请输入对服务器说的话");String mesFromConsole = readMesFromConsole.readLine();sendMesToServer.println(mesFromConsole);sendMesToServer.flush();// 读取服务器的消息String mesFromSer = readMesFromServer.readLine();System.out.println("服务器说:" + mesFromSer);// 如果服务器说 “bye”,则中断通讯,关闭各类流和Socket,结束while()循环if (mesFromSer.equals("bye")){System.out.println("通话结束!");readMesFromServer.close();readMesFromConsole.close();sendMesToServer.close();socket.close();break;}}} catch (Exception e) {// TODO: handle exception}}}