「socket封装java」socket封装比较好的框架

博主:adminadmin 2023-03-19 11:47:07 408

今天给各位分享socket封装java的知识,其中也会对socket封装比较好的框架进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java中url类里面是不是封装了socket

url和socket是java.net包里的不同类,他们之间是平行的,不是封装关系。

java socket技术 客户端实现不发送请求给服务端但是一直接收服务端发来的数据

说点泼冷水的话题

首先确认什么是客户端,什么是服务端。

从用户的角度,可见的、可操作的即是客户端,也就是你这里说的java开发的部分。而不可见的部分就是服务端,也就是你说的C部分。

而从网络开发的角度,发起请求的是客户端,而接收请求的是服务端。这与用户感受有很大区别。

当从java请求C的时候,java是客户端,C 是服务端。而当C主动请求时,则C就变成了客户端,而java 变成了服务端。

所以,从网络开发的角度,java想成为此次通信的服务端,必须长期维护一个端口可用,而C 要访问这个端口。

而java为了能够长期维护一个端口,一般采用socket 方式(其他方式也基本上都是基于socket的),由于java已经封装的很好了,只要new Socket(IP,port) 就可以 获得,同时,由于原来C 是服务器,而如果没有多个服务器同时向java端发送请求的话,基本连线程处理都不需要做的。

java socket 的优点

跟C#比,优点就是跨平台。跟C++的socket比,因为C++没有直接封装的socket,还是直接调用OS API去写的,所以很麻烦,实质还是面向过程的。而Java的socket直接给封装成类了,所以使用很简便,另外可靠性高,代码维护简单

Java之Socket与HTTP区别

这个是网上转的,相互学习,楼主可以看看。

Java之Socket与HTTP区别

我们都知道TCP/IP协议共分四层:

① 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

② 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(internet互联网控制报文协议),以及IGMP协议(internet组管理协议)。

③ 传输层,主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议: TCP(传输控制协议)和UDP(用户数据报协议)。 TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面, U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。 这两种运输层协议分别在不同的应用程序中有不同的用途,这一点将在后面看到。

④ 应用层,负责处理特定的应用程序细节。几乎各种不同的TCP/IP实现都会提供下面这些通用的应用程序:Telnet 远程登录。FTP 文件传输协议。SMTP 简单邮件传送协议。SNMP 简单网络管理协议。

我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。

1Socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等。而TCP和UDP协议属于传输层 。

而http是个应用层的协议,它实际上也建立在TCP协议之上(HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力)。

2Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。

下面是一些的重要的概念,特在此做摘抄和总结。

一。什么是TCP连接的三次握手

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)

二。利用Socket建立网络连接的步骤

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3。连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

三。HTTP链接的特点

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

四。TCP和UDP的区别

1。TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。

2。也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。

知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。

JAVA Socket如何封装一个电文包??

应该定义消息格式,通过指定的消息类型来理解并分类处理消息,一个好的通用型的消息通信模块应该设计成支持灵活的消息格式,这样才能做成独立的模块,没有消息格式的代码只能应用在特定的软件中,不能移植到被以后的新的项目使用。 例如:

Message msg = new Message("HeartBeat");

msg.setContent(""); //心跳消息或许不需要内容。

ps.print(msg.toXML()); // 把消息编码成类似 msg type="1" /msg

Message msg2 = new Message("QQ");

msg.setContent("你好");

ps.print(msg.toXML()); // 得到 msg type="2"你好/msg

服务端通过读取这个 xml 就知道它的 type 是什么类型的消息。这是基于纯文本的消息,如果你希望以二进制类型发送也可以,比如:

前面2字节是消息长度,第三个字节是消息类型,后面是消息内容本身,服务端就在读取时分析是否给定的长度的内容全部收到了,没有收到就等待,以后按字节位置找消息头所说的类型。一般来说用二进制也很灵活,它和纯文本没有什么差异,但纯文本适合聊天之类的软件,处理起来简单。现在很多聊天软件也是基于xml的,比如那个企业QQ就是这样的(我曾经看到以前的版本的消息内容默认不加密的,可以直接用 SQLLite JDBC 驱动读取消息内容看,全是 xml,不知道现在的QQ是不是)。

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 JComboBoxString jcb = new JComboBoxString();

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);

}

}

关于socket封装java和socket封装比较好的框架的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。