1、创建服务器类
1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import java.net.Socket; 4 import java.util.Scanner; 5 6 /** 7 * 服务器 8 * @author Administrator 9 *10 */11 public class Server {12 13 private int duankou = 9000;//端口号14 private ServerSocket server;//声明服务器15 private static Socket socket;//声明客户端16 private String serName;17 public Server(){18 try {19 init();20 } catch (IOException e) {21 e.printStackTrace();22 }23 }24 25 /*26 * 创建服务器,开始监听27 */28 private void init() throws IOException{29 server = new ServerSocket(duankou);30 System.out.println("------服务器已开启--------");31 System.out.println("请输入服务器名字:");32 Scanner sc = new Scanner(System.in);33 serName = sc.next();34 while(true){35 socket = server.accept();36 hands(socket);37 }38 }39 40 41 private void hands(Socket socket) {42 String key = socket.getInetAddress().getHostAddress()+":"+socket.getPort();43 System.out.println("监听到的客户端:"+key);44 Thread thread = new Thread(new ThreadSocket(socket));45 thread.setName(serName);46 thread.start();47 }48 49 public static void main(String[] args) {50 Server server = new Server();51 }52 53 }
2、创建客户端类
1 import java.io.IOException; 2 import java.net.Socket; 3 import java.net.UnknownHostException; 4 import java.util.Scanner; 5 6 /** 7 * 客户端 8 * @author Administrator 9 *10 */11 public class Client {12 13 private int port = 9000;14 private String ip="127.0.0.1";15 private static Socket socket;16 private String cliName;17 public Client(){18 try {19 init();20 } catch (Exception e) {21 e.printStackTrace();22 } 23 }24 25 private void init() throws Exception {26 27 System.out.println("-----客户端已开启-----");28 System.out.println("请输入客户端名字:");29 Scanner sc = new Scanner(System.in);30 cliName = sc.next();31 socket = new Socket(ip,port);32 }33 34 public void hands() throws Exception{35 Thread threadReader = new Thread(new ThreadReader(socket.getInputStream()),Thread.currentThread().getName());36 Thread threadWriter = new Thread(new ThreadWriter(socket.getOutputStream()));37 threadWriter.setName(cliName);38 threadReader.start();39 threadWriter.start();40 41 }42 43 public static void main(String[] args) throws Exception {44 Client client = new Client();45 client.hands();46 }47 48 }
3、服务器处理socket多线程
1 import java.io.IOException; 2 import java.net.Socket; 3 4 /** 5 * 服务器处理Socket线程 6 * @author Administrator 7 * 8 */ 9 public class ThreadSocket implements Runnable{10 11 private Socket socket;12 13 public ThreadSocket(Socket socket){14 this.socket = socket;15 }16 17 @Override18 public void run() {19 20 try {21 Thread threadReader = new Thread(new ThreadReader(socket.getInputStream()));22 Thread threadWriter = new Thread(new ThreadWriter(socket.getOutputStream()));23 threadReader.start();24 threadWriter.start();25 26 } catch (IOException e) {27 e.printStackTrace();28 }29 30 }31 32 }
4、读取输入流多线程
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 6 /** 7 * 读取输入流线程 8 * @author Administrator 9 *10 */11 public class ThreadReader implements Runnable{12 13 //private static int HEAD_SIZE=5;//传输最大字节长度14 //private static int BUFFER_SIZE=10;//每次读取10个字节15 private InputStream is;16 public ThreadReader(InputStream is) {17 this.is = is;18 }19 20 @Override21 public void run() {22 23 try {24 while(true){25 byte[] b = new byte[1024];26 int length = is.read(b);27 String message = new String(b,0,length);28 System.out.println(Thread.currentThread().getName()+":"+message);29 }30 } catch (IOException e) {31 e.printStackTrace();32 }33 34 }35 36 }
5、发送数据多线程
1 import java.io.IOException; 2 import java.io.OutputStream; 3 import java.util.Scanner; 4 5 /** 6 * 发送数据线程 7 * @author Administrator 8 * 9 */10 public class ThreadWriter implements Runnable{11 12 13 private OutputStream os;14 public ThreadWriter(OutputStream os) {15 this.os = os;16 }17 18 @Override19 public void run() {20 21 try {22 Scanner sc = new Scanner(System.in);23 while(true){24 System.out.println(Thread.currentThread().getName()+"说:");25 String message = sc.next();26 os.write(message.getBytes());27 os.flush();28 }29 } catch (IOException e) {30 e.printStackTrace();31 }32 33 }34 35 }