socket通信

Posted 佩喻幻的Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket通信相关的知识,希望对你有一定的参考价值。

socket通信

一:socket基于Tcp连接,数据传输有保证

二:socket连接的建立过程:

  1:服务器监听

  2:客户端发出请求

  3:建立连接

  4:通信

三:一个简单的例子:服务器端每隔一段时间发一些信息

1:创建一个服务器端监听的线程

public class ServerListener extends Thread {
    public void run() {
        try {
            //服务器端的socket
            ServerSocket serversocket=new ServerSocket(22345);
            while(true){
                //收到客户端的socket,
                Socket socket=serversocket.accept();
                //建立连接,弹窗
                JOptionPane.showMessageDialog(null, "有客户端连接到本地的22345端口");
                
                //将socket传递到新的线程(socket通信的线程)
                new ChatSocket(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

通信线程ChatSocket 类继承Thread,重写run()方法:

public class ChatSocket extends Thread {
    
    Socket socket;

    public ChatSocket(Socket socket) {
        super();
        this.socket = socket;
    }

    public void out(String out){
        try {
            socket.getOutputStream().write(out.getBytes("utf-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void run() {
        int count=0;
        while(true){
            count++;
            out("loop:"+count);
            try {
                sleep(400);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }    
    }    
    
}

新建一个程序测试类

public class MyServerSocket {

    /**在cmd里面是输入telent localhost 22345就可建立连接
     * @param args
     */
    public static void main(String[] args) {
        new ServerListener().start();
    }
}

效果如下:

 

 

 

看到这里,可以知道可以同时进行多个客户端的连接

上面的实例只能是服务器发送消息给客户端,但是客户端不能发送消息,怎么办呢?

请看下面

二:多个客户端同时在线通信,一个客户端发送一条消息,然后全部的客户端都可以收到

这里要新建一个socket管理类,把所有的ChatSocket放在一起,用到了Vector<>,可增长的对象数组

public class ChatManager {
    
    public void ChatManger(){}
    
    private static final ChatManager cm=new ChatManager();
    
    public static ChatManager getChatManager(){
        return cm;
    }

    //Vector 类可以实现可增长的对象数组
    Vector<ChatSocket> vector=new Vector<ChatSocket>();
    
    public void add(ChatSocket cs){
        vector.add(cs);
    }
    
    //发送信息
    public void  publish(ChatSocket cs,String out){
            for(int i=0;i<vector.size();i++){
                ChatSocket csChatSocket =vector.get(i);
                if(!cs.equals(csChatSocket)){
                    csChatSocket.out(out);
                }
            }
    }
}

 

ChatSocket代码完善

public class ChatSocket extends Thread {
    Socket socket;
    public ChatSocket(Socket socket) {
        super();
        this.socket = socket;
    }
        //写数据
    public void out(String out){
        try {
            socket.getOutputStream().write(out.getBytes("utf-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    //当前服务器不断地 读取 客户端传来的数据,把接受的数据传到Vector<ChatSocket>集合
    public void run() {
        try {
            BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));

            String line=null;
            while((line=br.readLine())!=null){
                ChatManager.getChatManager().publish(this, line);//this是当前线程
            }
            br.close();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
ServerListener 类
public class ServerListener extends Thread {

    public void run() {
        try {
            //服务器端的socket
            ServerSocket serversocket=new ServerSocket(22345);
            while(true){
                //收到客户端的socket,
                Socket socket=serversocket.accept();
                //建立连接
                JOptionPane.showMessageDialog(null, "有客户端连接到本地的22345端口");
                
                //将socket传递到新的线程(socket通信的线程)
                ChatSocket cs=new ChatSocket(socket);
                cs.start();
                ChatManager.getChatManager().add(cs);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

测试代码同上,

效果如下

 

以上是关于socket通信的主要内容,如果未能解决你的问题,请参考以下文章

与另一个片段通信的片段接口

socket通信

Python 之 Socket编程(TCP/UDP)

C#:Socket通信

Socket通信客户端和服务端代码

socket网络编程:在简单套接字基础上加上通信循环(代码完善)