Socket 服务端和客户端通信 相互发消息

1.TCP连接是网络连接中的以一种,是很多其他协议的承载协议(本质),CP协议的连接在java、中使用的是套接字来实现的套接字类分为两种,一种是为了满足服务器使用的套接字,另一种是客户端使用的套接字,java中的Socket就是一个套接

 

先面我先实现一个服务端,可以连接好多个客户端

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
 
public class TCPTest {
 
    //客户端组,连接的所有客户端放在这个List中
    public static List<Socket> clients = new ArrayList<>();
    
    public static void main(String[] args) {
        /*
         * Socket这个类,我们直接创建对象时用的,是客户端连接服务器用的代码如下:
         * Socket socket = new Socket(host,port);
         */
        try {
            
            @SuppressWarnings("resource")
            //定义服务端的端口号
            ServerSocket server = new ServerSocket(500);
            //创建套接字
            Socket s ;//阻塞方式
            //阻塞式的,没有client端连接就一直监听着,等待连接.直到有client端连接进来才通过                
            //socket实例与client端进行交互,一个server端可以被多个client端连接,每连接一次都会创 
            //建一个socket实例,派发服务线程.
            while(( s = server.accept()) != null){
                
                clients.add(s);    
                //通信的类,用线程来实现
                GetDtaThread data = new GetDtaThread(s);
                data.start();
                
            }
            
            System.out.println("你走了啊 拜拜");
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
}


交互的类  GetDtaThread 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
 
public class GetDtaThread extends Thread{
    
    Socket s ;
    //就是强行把缓冲区的数据输出
    PrintWriter pw ;
    
    public GetDtaThread(Socket s) {
        
        this.s = s ;
    }
 
    @Override
    public void run() {
 
        Scanner scanner = new Scanner(System.in);
 
        String str1;
 
        while((str1=scanner.next())!=null) {
            //输出的线程方法
            WriteDataThread.broadCastToAll(str1);
        }
        try {
            //获取客户端发来的消息,InputStreamReader将字节装华为字符 缓存到BufferedReader缓冲区
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            
            String str ;
            
            while((str = br.readLine()) != null) {
 
                //客户端的Ip+发过来的内容
                System.out.println(s.getInetAddress() + " : " + str);
                
                //写过去,发送给客户端
                WriteDataThread.broadCastToAll(str);
                //输入bye结束交谈
                if(str.equals("bye")) {
                    
                    br.close();
                    break;
                }
            }
            
        } catch (IOException e) {
            
            e.printStackTrace();
        }
        
    }
}


交互的类  WriteDataThread

 

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
 
public class WriteDataThread extends Thread {
 
    Socket s;
 
    public WriteDataThread(Socket s) {
 
        this.s = s;
    }
 
    @Override
    public void run() {
 
    }
 
    public  static void broadCastToAll(String str) {
 
        
        try {
 
            for (Socket socket : TCPTest.clients) {
            
                    //行把缓冲区的数据输出            返回一个服务器与客户端的输出流
                    PrintWriter pw = new PrintWriter(socket.getOutputStream());
 
                    pw.println(str);
 
                    pw.flush();
                
            }
        } catch (IOException e) {
 
            e.printStackTrace();
        }
 
    }
 
}

 

在实现一个客户端

package com.lanou.classwork;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class User {
 
    public static void main(String[] args) {
        
        //创建用户
        try {
            Socket socket = new Socket("127.0.0.1", 500);
            //向服务端发消息的类
            SendChat send = new SendChat(socket);
            send.start();
            //接受服务端发来的消息
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String str ;
            while((str = br.readLine())!=null) {
                System.out.println(str);
 
            }
 
 
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}


交互类  SendChat 

import com.lanou.homework.Tmocat;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
 
//发消息给服务端
public class SendChat extends Thread{
 
    PrintWriter pw ;
    Socket socket;
    public SendChat(Socket socket) {
        this.socket = socket;
    }
    
    @Override
    public void run() {
        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);
        
        String str ;
 
        while((str=scanner.next())!=null){
            
            try {
                pw = new PrintWriter(socket.getOutputStream());
                System.out.println( str);
                pw.println(str);
                pw.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            if(str.equals("bye")){
                pw.close();
            }
 
            
        }
    }
 
    
    
}


 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值