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通信的主要内容,如果未能解决你的问题,请参考以下文章