多线程_TCP编程
java源码示例展示:
服务端:
1 package tcp2; 2 3 import java.io.IOException; 4 import java.net.InetAddress; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 /** 9 * 登录的服务器 10 * @author superdrew 11 * TCP 登录 12 * 功能:用户在客户端输入用户名和密码提交给服务器,服务器接收并处理,处理完后给客户端一个返回信息 13 * 客户端接口服务器的反馈消息并输出 14 * 缺点:服务器处理一次用户请求之后,就关闭了 15 * 应该是服务器一直监听,可以处理多个用户的请求 16 * 使用while循环类似达到效果,但是不可以 17 * 不是并行,是串行的。请求一次,只能等待该次请求执行完毕 18 * 19 * 问题:学生1-------咨询1 学生2---------咨询1 学 生3------------咨询1 20 * 21 * 解决: 22 * 学生1------------ ---------------咨询1 23 * 学生2 ------------ 前台接待 ---------------咨询2 24 * 学生3------------ ----------------咨询3 25 * 26 * 使用线程来处理 27 */ 28 public class LoginServer { 29 public static void main(String[] args) throws IOException { 30 //1.创建一个serversocket 创建服务 31 @SuppressWarnings("resource") 32 ServerSocket serverSocket = new ServerSocket(8888);//端口 8888 IP地址是本机 33 int i =1; 34 while(true){ 35 Socket socket = serverSocket.accept(); 36 InetAddress ia = socket.getInetAddress(); 37 new LoginThread(socket).start(); 38 System.out.println("第"+ i++ +"个人来访问,访问者ip是:"+ia.getHostAddress()); 39 } 40 } 41 }
客户端:
1 package tcp2; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.io.IOException; 6 import java.io.OutputStream; 7 import java.net.InetAddress; 8 import java.net.Socket; 9 import java.net.UnknownHostException; 10 import java.util.Scanner; 11 12 /** 13 * 登录的客户端 14 * @author superdrew 15 * 16 */ 17 public class LoginClient { 18 public static void main(String[] args) throws UnknownHostException, IOException { 19 //1.创建一个socket 连接服务器 20 Socket socket = new Socket(InetAddress.getLocalHost(), 8888);//必须要知道服务器IP和端口号 21 @SuppressWarnings("resource") 22 Scanner sc = new Scanner(System.in); 23 //2.通过 socket 发送数据给服务器 24 //OutputStream os = new FileOutputStream("d:/b.txt");输出到文件 25 System.out.println("请输入登入信息:"); 26 String info = sc.nextLine(); 27 OutputStream os = socket.getOutputStream(); 28 DataOutputStream dos = new DataOutputStream(os); 29 dos.writeUTF(info); 30 //3.接收服务器返回的消息 31 DataInputStream dis = new DataInputStream(socket.getInputStream()); 32 String result = dis.readUTF(); 33 System.out.println("服务器返回的消息response:"+result); 34 35 //4.关闭资源 36 dis.close(); 37 dos.close(); 38 socket.close(); 39 } 40 }
多人登入的线程:
1 package cn.com.sxt.tcp2; 2 3 import java.io.DataInputStream; 4 import java.io.DataOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.net.Socket; 8 9 /** 10 * 登录线程 11 * @author superdrew 12 * 13 */ 14 public class LoginThread extends Thread{ 15 private Socket socket; 16 17 public void setSocket(Socket socket){ 18 this.socket = socket; 19 } 20 21 public LoginThread(Socket socket){ 22 this.socket = socket; 23 } 24 25 public void run() { 26 InputStream is; 27 DataOutputStream dos = null; 28 DataInputStream dis = null; 29 30 try { 31 is = socket.getInputStream(); 32 dis = new DataInputStream(is); 33 String result = dis.readUTF(); 34 System.out.println("客户端发送来的消息:"+result); 35 //4.给客户端反馈一个消息 36 dos = new DataOutputStream(socket.getOutputStream()); 37 if("superdrew".equals(result)){ 38 dos.writeUTF("登录成功"); 39 }else{ 40 dos.writeUTF("登录失败"); 41 } 42 } catch (IOException e) { 43 e.printStackTrace(); 44 }finally{ 45 try { 46 if(dos!=null){ 47 dos.close();//关闭dos 48 } 49 } catch (IOException e) { 50 e.printStackTrace(); 51 } 52 try { 53 if(dis!=null){ 54 dis.close();//关闭dis 55 } 56 } catch (IOException e) { 57 e.printStackTrace(); 58 } 59 try { 60 if(socket!=null){ 61 socket.close();//关闭socket 62 } 63 } catch (IOException e) { 64 e.printStackTrace(); 65 } 66 } 67 68 } 69 }
操作步骤:
①运行服务端;②运行客户端;③输入登入信息为superdrew;④在console窗口下点击,可以看到这是第几次登入以及相关记录的信息;
结果展示---如图: