socket通讯,可以相应多个客户端源码

来源:互联网 发布:淘宝信誉度等级表 编辑:程序博客网 时间:2024/06/05 23:44
/** * 工具类 *  * @author  *  */public class Util {/** 绑定端口号 */public static final int PORT = 10000;/** 绑定地址 */public static final String ADDRESS = "localhost";}


import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/** * 服务器类 *  * @author  *  */public class Server {private ServerSocket serverSocket = null;/** * 无参构造 *  * @throws IOException */public Server() throws IOException {this.serverSocket = new ServerSocket(Util.PORT);}/** * 连接客户端,并开启MySocket线程相应客户端 */public void doService() {try {// 不断响应客户端请求,将计数器作为服务器端对客户端的标识int i = 0;while (true) {Socket s = this.serverSocket.accept();new MySocket((++i) + "", s).start();}} catch (IOException e) {e.printStackTrace();} finally {try {if (this.serverSocket != null) {this.serverSocket.close();this.serverSocket = null;}} catch (IOException e) {e.printStackTrace();}}}/** * 相应客户端线程 *  * @author  *  */private class MySocket extends Thread {private Socket socket = null;/** 与客户端连接的输入流 */private BufferedReader reader = null;/** 与客户端连接的输出流 */private PrintWriter writer = null;/** 客户端连接的客户端名称,用于区别可别连接的客户端 */private String name = null;public MySocket(String name, Socket socket) {this.name = name;this.socket = socket;}@Overridepublic void run() {try {// 获得输入输出流reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));writer = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()), true);String str = null;while (true) {// 将从客户端获取的数据加工后发送给客户端str = reader.readLine();System.out.println("client " + name + " says : " + str);writer.println("Server says: " + str);// 如果客户端输入bye退出该客户端相应if (str.equalsIgnoreCase("bye")) {break;}}} catch (IOException e) {e.printStackTrace();} finally {try {if (writer != null) {writer.close();writer = null;}if (reader != null) {reader.close();reader = null;}if (socket != null) {socket.close();socket = null;}} catch (IOException e) {e.printStackTrace();}}}}public static void main(String[] args) throws IOException {new Server().doService();}}

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;/** * 客户端类 *  * @author  *  */public class Client {private Socket socket = null;/** 连接服务器的输入流 */private BufferedReader reader = null;/** 从控制台获得的输入流 */private BufferedReader consolReader = null;/** 连接服务器的输出流 */private PrintWriter writer = null;public Client() {try {// 连接服务器端,并获得输入输出流this.socket = new Socket(Util.ADDRESS, Util.PORT);reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));consolReader = new BufferedReader(new InputStreamReader(System.in));writer = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()), true);String str = null;// 不断地与服务器交互,输入bye退出程序while (true) {str = consolReader.readLine();// System.out.println(str);writer.println(str);if (str.equalsIgnoreCase("bye")) {break;}System.out.println(reader.readLine());}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if (writer != null) {writer.close();writer = null;}if (reader != null) {reader.close();reader = null;}if (consolReader != null) {consolReader.close();consolReader = null;}} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {new Client();}}