//---------------------------------------------------------------------------服务器端多线程:就是和多个客户端连接
1 package com.peng.Socket_TCP; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.net.Socket; 10 11 public class ServerThread extends Thread { 12 // 和本线程相关的Socket 13 Socket socket = null; 14 15 public ServerThread(Socket socket) { 16 this.socket = socket; 17 } 18 19 //线程执行的操作,响应客户端的请求 20 public void run(){ 21 InputStream is=null; 22 InputStreamReader isr=null; 23 BufferedReader br=null; 24 OutputStream os=null; 25 PrintWriter pw=null; 26 try { 27 //获取输入流,并读取客户端信息 28 is = socket.getInputStream(); 29 isr = new InputStreamReader(is); 30 br = new BufferedReader(isr); 31 String info=null; 32 while((info=br.readLine())!=null){//循环读取客户端的信息 33 System.out.println("我是服务器,客户端说:"+info); 34 } 35 socket.shutdownInput();//关闭输入流 36 //获取输出流,响应客户端的请求 37 os = socket.getOutputStream(); 38 pw = new PrintWriter(os); 39 pw.write("欢迎!"); 40 pw.flush();//调用flush()方法将缓冲输出 41 } catch (IOException e) { 42 // TODO Auto-generated catch block 43 e.printStackTrace(); 44 }finally{ 45 //关闭资源 46 try { 47 if(pw!=null) 48 pw.close(); 49 if(os!=null) 50 os.close(); 51 if(br!=null) 52 br.close(); 53 if(isr!=null) 54 isr.close(); 55 if(is!=null) 56 is.close(); 57 if(socket!=null) 58 socket.close(); 59 } catch (IOException e) { 60 e.printStackTrace(); 61 } 62 } 63 } 64 65 }
//---------------------------------------------------------------------------单独连接
1 package com.peng.Socket_TCP; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.net.Socket; 10 import java.net.UnknownHostException; 11 /* 12 * 基于TCP的Socket通信:服务器和客户端----客户端类 13 * 1、创建Socket类,设置连接服务器的主机和端口 14 * 2、输出数据到服务器(注意关闭socket的输出流) 15 * 3、输入服务器的响应(注意关闭socket的输入流) 16 * 4、关闭资源 17 * 18 * 19 */ 20 public class SingleConnect_client { 21 22 public static void main(String[] args) { 23 24 try { 25 //1.创建客户端Socket,指定服务器地址和端口 26 Socket socket=new Socket("192.168.2.100", 8884); 27 //2.获取输出流,向服务器端发送信息 28 OutputStream os=socket.getOutputStream();//字节输出流 29 PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流 30 pw.write("呵呵呵呵"); 31 pw.flush(); 32 socket.shutdownOutput();//关闭输出流 33 //3.获取输入流,并读取服务器端的响应信息 34 InputStream is=socket.getInputStream(); 35 BufferedReader br=new BufferedReader(new InputStreamReader(is)); 36 String info=null; 37 while((info=br.readLine())!=null){ 38 System.out.println("我是客户端,服务器说:"+info); 39 } 40 //4.关闭资源 41 br.close(); 42 is.close(); 43 pw.close(); 44 os.close(); 45 socket.close(); 46 } catch (UnknownHostException e) { 47 e.printStackTrace(); 48 } catch (IOException e) { 49 e.printStackTrace(); 50 } 51 } 52 53 }
//---------------------------------------------------------------------------
1 package com.peng.Socket_TCP; 2 3 import java.io.IOException; 4 import java.net.InetAddress; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 /* 8 * 基于TCP的Socket通信:服务器和客户端----服务器类 9 * 1、创建ServerSocket类,设置连接服务器的端口 10 * 2、用ServerSocket对象的accept()方法创建socket对象 11 * 3、输入客户端的数据(注意关闭socket的输入流):socket.shutdownInput(); 12 * 4、输出响应到客户端(注意关闭socket的输出流):socket.shutdownOutput(); 13 * 5、关闭资源 14 * @author Lenovo 15 * 16 * 17 *线程中就是端口指定,但是用循环来接受客户端的数据 18 * 19 *获取客户端的IP用的是 socket.getInetAddress() 20 *获取Socket通信的输入流: socket.getInputStream() 并包装 21 *获取Socket通信的输出流: socket.getOutputStream() 并包装 22 * 23 * 24 */ 25 26 public class SingleConnect_server { 27 public static void main(String[] args) { 28 try { 29 //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 30 ServerSocket serverSocket=new ServerSocket(8888); 31 Socket socket=null; 32 33 //记录客户端的数量 34 int count=0; 35 System.out.println("***服务器即将启动,等待客户端的连接***"); 36 //循环监听等待客户端的连接 37 while(true){ 38 //调用accept()方法开始监听,等待客户端的连接 39 socket=serverSocket.accept(); 40 //创建一个新的线程 41 ServerThread serverThread=new ServerThread(socket); 42 //启动线程 43 serverThread.start(); 44 45 count++;//统计客户端的数量 46 System.out.println("客户端的数量:"+count); 47 InetAddress address=socket.getInetAddress(); 48 System.out.println("当前客户端的IP:"+address.getHostAddress()); 49 } 50 } catch (IOException e) { 51 e.printStackTrace(); 52 } 53 } 54 55 }