socket建立连接的步骤(怎么建立socket连接)

      最后更新:2024-01-18 10:12

      java中如何创建socket连接的过程

      这是我写过的一个简单聊天软件客户端  你参考下import java.util.*;import java.io.*;import java.net.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;public class testChatClient extends JFrame{ private JTextArea jta = new JTextArea(); private JTextField jtf = new JTextField(); private JComboBox jcb = new JComboBox(); private JButton jbsend = new JButton("send"); private JButton jbrefresh = new JButton("refresh"); private InputStream input; private OutputStream output; private Socket socket; public static String SERVER_IP = "192.168.1.101"; public static int SERVER_PORT = 8888; // Message 1 -> refresh message // Message 2 -> send message public testChatClient() { initComponents(); try { socket = new Socket(SERVER_IP,SERVER_PORT); input = socket.getInputStream();output = socket.getOutputStream(); } catch(IOException e) { System.err.println(e); } jbrefresh.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { jta.setText(""); try { if(socket == null) socket = new Socket(SERVER_IP,SERVER_PORT); output.write(0x31);} catch (IOException ex) { JOptionPane.showConfirmDialog(null, ex); }} }); jbsend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(jtf.getText() == null || jtf.getText().equals("")) return; if(jtf.getText().length() >= 400) { JOptionPane.showConfirmDialog(null,"最大字数不能超过400"); return; } try { String destination = jcb.getSelectedItem().toString(); String message = jtf.getText(); if(socket == null) socket = new Socket(SERVER_IP,SERVER_PORT); byte[] temp = new byte[3 + destination.getBytes().length + message.getBytes().length]; temp[0] = 0x32; temp[1] = (byte)destination.getBytes().length; int i = 2; for(int j = 0; j < destination.getBytes().length ; i++ , j++) temp[i] = destination.getBytes()[j]; temp[i++] = (byte)message.getBytes().length; for(int j = 0 ; j < message.getBytes().length ; i++ , j++) { temp[i] = message.getBytes()[j]; System.out.println(); } output.write(temp); jta.append("me:n"); jta.append(jtf.getText()); jta.append("n"); jtf.setText(""); } catch(IOException ex) { System.err.println(ex); } } }); try { jbrefresh.doClick(); while(true) { byte[] tempBytes = new byte[1000]; input.read(tempBytes); int command = tempBytes[0] - 0x30; // int readLength = input.read(); switch(command) { case 1: { int readLength = tempBytes[1]; String[] temp = new String(tempBytes,2,readLength,"UTF-8").split(";"); jcb.removeAllItems(); if(temp.length == 0 && temp[0].equals("")) return; for(int i = 0 ; i < temp.length ;i++) { jcb.addItem(temp[i]); } jcb.setSelectedIndex(0); break; } case 2: { int readLength1 = tempBytes[1]; jta.append(new String(tempBytes,2,readLength1,"UTF-8") + "n"); int readLength2 = tempBytes[2 + readLength1]; jta.append(new String(tempBytes,3 + readLength1,readLength2,"UTF-8") + "n"); break; } } } } catch(IOException e) { System.err.println(e); } } public static void main(String[] args) { testChatClient frame = new testChatClient(); } public void initComponents() { setLayout(new BorderLayout()); JPanel jpNorth = new JPanel(); jpNorth.setLayout(new BorderLayout()); jpNorth.add(jcb,BorderLayout.CENTER); jpNorth.add(jbrefresh,BorderLayout.EAST); JPanel jpSouth = new JPanel(); jpSouth.setLayout(new BorderLayout()); jpSouth.add(jtf,BorderLayout.CENTER); jpSouth.add(jbsend,BorderLayout.EAST); add(jpNorth,BorderLayout.NORTH); add(jpSouth,BorderLayout.SOUTH); add(new JScrollPane(jta),BorderLayout.CENTER); this.getRootPane().setDefaultButton(jbsend); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300,600); setVisible(true); }}
      Java建议使用Jpcap这个封装好的功能包括几乎所有winpcap的。 百度一下,有帮助文档和Demo可以自己看下。需要的话我也可以上传给你
      //创建Socket 客户端对象 Socket s = new Socket("127.0.0.1",6666);//创建ServerSocket 服务器端对象。。ServerSocket ss = new ServerSocket(6666);//监听服务器连接 s = ss.accept();
      java中如何创建socket连接的过程

      如何创建一个tls的socket进行连接

      :java socket建立连接的过程如下: socket 1、 首先调用Socket类的构造函数,以服务器的指定的IP地址或指定的主机名和指定的端口号为参数,创建一个Socket流,在创建Socket流的过程中包含了向服务器请求建立通讯连接的过程实现。
      如何创建一个tls的socket进行连接

      面试笔记-Socket MQTT Websocket

      1.Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 2.MQTT协议是应用层协议不依赖长连接,适合弱网络。通过topic缓存信息。符合物联网设备的使用场景。因为通过topic缓存信息,因此可以实现通过topic与多个端的一对多连接,而不是设备与设备的多对多连接,节省了能耗及带宽。MQTT的心跳,及非信息的报文,较Websocket更少,更节省带宽及能耗。更适用于物理网的多种网络协议。3.WebSocket和Http一样在应用层,提供使用一个TCP连接进行双向通讯的机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯的机制。本质上来说,WebSocket是不限于HTTP协议的,但是由于现存大量的HTTP基础设施,代理,过滤,身份认证等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP连接建立后的握手消息是基于HTTP的,由服务器判断这是一个HTTP协议,还是WebSocket协议。 WebSocket连接除了建立和关闭时的握手,数据传输和HTTP没丁点关系了。Socket 连接,至少需要一对套接字,分为 clientSocket,serverSocket 连接分为3个步骤:(1) 服务器监听:服务器并不定位具体客户端的套接字,而是时刻处于监听状态;(2) 客户端请求:客户端的套接字要描述它要连接的服务器的套接字,提供地址和端口号,然后向服务器套接字提出连接请求;(3) 连接确认:当服务器套接字收到客户端套接字发来的请求后,就响应客户端套接字的请求,并建立一个新的线程,把服务器端的套接字的描述发给客户端。一旦客户端确认了此描述,就正式建立连接。而服务器套接字继续处于监听状态,继续接收其他客户端套接字的连接请求.Socket为长连接:通常情况下Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通讯双方开始互发数据内容,直到双方断开连接。在实际应用中,由于网络节点过多,在传输过程中,会被节点断开连接,因此要通过轮询高速网络,该节点处于活跃状态。很多情况下,都是需要服务器端向客户端主动推送数据,保持客户端与服务端的实时同步。若双方是 Socket 连接,可以由服务器直接向客户端发送数据。若双方是 HTTP 连接,则服务器需要等客户端发送请求后,才能将数据回传给客户端。因此,客户端定时向服务器端发送请求,不仅可以保持在线,同时也询问服务器是否有新数据,如果有就将数据传给客户端。MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如:①网络代价昂贵,带宽低、不可靠。②在嵌入设备中运行,处理器和内存资源有限。该协议的特点有:①使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。②对负载内容屏蔽的消息传输。③使用 TCP/IP 提供网络连接。④有三种消息发布服务质量:⑤"至多一次",消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。⑥"至少一次",确保消息到达,但消息重复可能会发生。⑦"只有一次",确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。⑧小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。⑨使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。有三种消息发布服务质量:“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。qos=0“至少一次”,确保消息到达,但消息重复可能会发生。qos=1“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。qos=2Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);payload,可以理解为消息的内容,是指订阅者具体要使用的内容。在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下:固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。 WebSocket则提供使用一个TCP连接进行双向通讯的机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯的机制。本质上来说,WebSocket是不限于HTTP协议的,但是由于现存大量的HTTP基础设施,代理,过滤,身份认证等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP连接建立后的握手消息是基于HTTP的,由服务器判断这是一个HTTP协议,还是WebSocket协议。 WebSocket连接除了建立和关闭时的握手,数据传输和HTTP没丁点关系了。由此可知两者的应用场景不一样:MQTT是为了物联网场景设计的基于TCP的Pub/Sub协议,有许多为物联网优化的特性,比如适应不同网络的QoS、层级主题、遗言等等。WebSocket是为了HTML5应用方便与服务器双向通讯而设计的协议,HTTP握手然后转TCP协议,用于取代之前的Server Push、Comet、长轮询等老旧实现。两者之所有有交集,是因为一个应用场景:如何通过HTML5应用来作为MQTT的客户端,以便接受设备消息或者向设备发送信息,那么MQTT over WebSocket自然成了最合理的途径了。
      面试笔记-Socket MQTT Websocket

      如何建立"socket"连接?

      一般socket链接有以下两种方式:长(常)链接和短链接。 长链接:当数据发送完成后socket链接不断开。一直保留到异常或者是程序退出为止 ,这种方式的好处是不用每次去发起连接断开,在速度上可以比短连接要快一些,但是相 对来说对服务器的资源压力也要大些。长链接用的范围很广,比如游戏系统,qq等等,长 (常)链接一般还需要定时向服务器ping数据,以保证socket链接畅通。当ping不通服务 器时,需要重新开启链接。短链接:当一次数据发送完毕后,主动断开链接,每次发送数据都要一次链接、断开 操作,这种方式的好处是:对服务器的资源占用相对来说比较小,但是由于每次都要重新 链接,速度开销上也比较大,这种方式对于那种不需要经常与服务器交互的情况下比较适 用。上面两种方法在用户量非常大的情况下都存在着很大的不足,因此,考虑可以用 一种折衷的办法,那就是使用socket的连接池。程序一开始初始化创建若干数量的长链接。给他们设置一个标识位,这个标识位表示 该链接是否空闲的状态。当需要发送数据的时候,系统给它分配一个当前空闲的链接。同 时,将得到的链接设置为“忙”,当数据发送完毕后,把链接标识位设置为 “闲”,让系统可以分配给下个用户,这样使得两种方式的优点都充分的发挥 出来了。用户数量足够多的时候,只需要动态增加链接池的数量即可。下面我们用具体的程序来讲解下:首先声明一个socket类:public class XieGouSocket{public Socket m_socket; //Socket对象public bool m_isFree; //判断是否空闲public int m_index; //在链接缓存池中的索引值}下面的函数是创建socket链接池,这里为了使代码更加清晰,特地把异常处理部分 全部取掉了。public XieGouSocket[] m_socket; //先定义个缓冲池public void CreateSocketPool(){string ip= “127.0.0.1”;string port= 2003;IPAddress serverIp=IPAddress.Parse(ip);int serverPort=Convert.ToInt32(port);IPEndPoint iep=new IPEndPoint(serverIp,serverPort);m_socket = new XieGouSocket[200];for(int i =0; i < 200 ; i ++){m_socket[i] = new XieGouSocket();m_socket[i].m_index = i ;m_socket[i].m_isFree = true;m_socket[i].m_socket =new Socket (AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);m_socket[i].m_socket.SetSocketOption (SocketOptionLevel.Socket,SocketOptionName.SendTimeout,1000);m_socket[i].m_socket.Connect(iep);}}下面的函数是获取当前空闲的socket链接:因为是多线程,所以需要加一个原子操作,定义一个原子变量,以防止多个线程 之间抢占资源问题的发生。private static Mutex m_mutex=new Mutex();public static XieGouSocket GetFreeConnection(){m_mutex.WaitOne(); //先阻塞for(int i =0; i < m_socket.Length ; i ++){if(m_socket[i].m_isFree) //如果找到一个空闲的{m_socket[i].m_isFree = false;m_mutex.ReleaseMutex();//释放资源return m_socket[i];}}//如果没有空闲的链接,要么等待,要么程序再动态创建一个链接。m_mutex.ReleaseMutex();//释放资源return null;} 当数据发送完毕后,程序必须将m_isFree 设置为 False。否则只使用不释放,程序很 快就溢出了。
      如何建立

      android 中socket 怎样建立连接

      参考如下内容,建立socker连接: 1.建立Socket连接1) Socket 实现了TCP/IP协议,可以连接到网络上的上脑,并收发数据2) ServerSocket 用于服务端,可以监听服务端口,等待客户端连接,连接后可以生成用于传输数据的Socket3) 创建服务端ServerSocket serverSocket = new ServerSocket(9999);Socket socket =serverSocket.accept();//等待客户端连接4) 创建客户端Socket socket = new Socket("100.100.28.26", 9999);// 注意:注册网络权限;不能在主线程做网络连接5) 客户端发送消息DataOutputStream writer = new DataOutputStream(socket.getOutputStream());writer.writeUTF("嘿嘿,你好啊,服务器..");// 写一个UTF-8的信息6) 服务端接收消息DataInputStream reader = new DataInputStream( socket.getInputStream());String msg = reader.readUTF(); 7)服务器等待说明
      android 中socket 怎样建立连接

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类