java socket 多客户端和服务器的通信

来源:互联网 发布:京东商城地区json数据 编辑:程序博客网 时间:2024/06/08 06:44

    所谓可以多客户端,就是需要在服务器端进行多线程编程,每一个客户端对应一个线程。如果要实现时时通讯和话,无论是客户端还是服务器端都要至少两个线程,主线程进行发送信息,子线程进行获取信息,这样可以保证时时通信.

下面贴出我的代码:

客户端:

package com.lip;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.util.Scanner;public class Client{/** * Author: Lip  * 客户端 */public static void main(String[] args){Socket socket = null;BufferedReader br = null;PrintWriter pw = null;Scanner scanner = new Scanner(System.in);// 从键盘读取try{// 创建客户端socketsocket = new Socket(Server.HOST, Server.PORT);// 读取从客户端发来的消息br = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 写入信息到服务器端pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));new ReadServerMessage(br);// 从服务器读取消息while (true){String temp = scanner.nextLine();// 从键盘读取一行pw.println(temp);// 写到服务器pw.flush();if (temp.equals("q"))break;}}catch (Exception e){e.printStackTrace();}finally{try{System.out.println("close......");br.close();pw.close();socket.close();}catch (IOException e){e.printStackTrace();}}}}class ReadServerMessage extends Thread//从服务器读取消息{BufferedReader bReader;    Socket socket;public ReadServerMessage(BufferedReader br){this.bReader = br;start();}public void run(){String str = "";while (true)//一直等待着服务器的消息{try{str = bReader.readLine();if (str.equals("q")){  bReader.close();  socket.close();  break;}}catch (IOException e){e.printStackTrace();}System.out.println("Server Message:" + str);}}}

服务器端:

package com.lip;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server{/** * Author:Lip Desc:SSD8_exercise1 */public static int PORT = 8000;public static String HOST = "127.0.0.1";public static void main(String[] args){ServerSocket serverSocket = null;Socket socket = null;try{serverSocket = new ServerSocket(PORT);// 等待请求,无请求一直等待while (true){System.out.println("Waiting Client");socket = serverSocket.accept();// 接受请求System.out.println("Client Conect!");new ThreadedServer(socket);}}catch (Exception e){try{socket.close();}catch (IOException e1){e1.printStackTrace();}}finally{                       try{serverSocket.close();}catch (IOException e){e.printStackTrace();}}}}

辅助线程:

package com.lip;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.util.Scanner;public class ThreadedServer extends Thread{private Socket socket = null;private BufferedReader br = null;private PrintWriter pw = null;private Scanner scanner = null;public ThreadedServer(Socket s){socket = s;try{br = new BufferedReader(new InputStreamReader(socket.getInputStream()));pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);scanner = new Scanner(System.in);// 从键盘读取数据start();}catch (Exception e){e.printStackTrace();}}public void run(){new ReadClientMessage(br, socket);//读取客户端数据while (true)//向客户端发送数据{try{pw.println(scanner.nextLine());pw.flush();}catch (Exception e){try{br.close();pw.close();socket.close();}catch (IOException e1){e1.printStackTrace();}}}}}class ReadClientMessage extends Thread{BufferedReader bReader;        Socket socket;public ReadClientMessage(BufferedReader br,Socket s){this.bReader = br;this.socket=s;start();}public void run(){String str = "";while (true){try{str = bReader.readLine();if (str.equals("q")){  bReader.close();  socket.close();  break;}}catch (IOException e){e.printStackTrace();}System.out.println("Client Message:" + str);}}}

现在就可以实现多客户端和服务器端通信了 ,不过客户端和客户端的通信暂时还没有搞懂,还要继续去学习。

原创粉丝点击