网络通信Socket通信
文章目录
一、Socket是什么?
socket 通信技术就是两台联网的计算机之间交换数据的技术。它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
1.应用场景
在一个对外交互项目中,要实现我我们系统与外界系统
进行数据传输、文件信息交换比如XML报文方式等,就要用到Socket。可能你觉得你没用过其实不然,因为大部分公司都会封装自己的架构,同样也会把Socket的底层封装好,让你直接用就可以啦,但是我们还是要去了解他的底层实现,这样会更了解系统之间的交互方式。
二、基于TCP协议进行通信
1.优点
TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统。
2.创建SocketService服务端
注意IP、端口号信息。
public class FuWuSocket_TCP {
public static void main(String[] args) {
ServerSocket ss=null;
Socket s=null;
BufferedReader reader=null;
try {
ss = new ServerSocket(10001);
System.out.println("TCP服务端启动啦。。。。");
//接受客户端请求
s = ss.accept();
//获得流的对象
InputStream inputStream = s.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
while (true){
String line = reader.readLine();
if("exit".equals(line)){
//判断接受的数据如果为exit就跳出循环
break;
}
InetAddress adders = s.getInetAddress();
//获取客户端IP地址
String ip = adders.getHostAddress();
System.out.println(ip+"TCP_发送了"+line);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(reader!=null){
reader.close();
}
if(s!=null){
s.close();
}
if(ss!=null){
ss.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.创建Socket客户端
注意IP、端口号信息。服务端ip端口
public class KeHuSocket_TCP {
public static void main(String[] args) {
//创建请求的socket
Socket s=null;
BufferedWriter Writer=null;
BufferedReader reader=null;
try {
s = new Socket("127.0.0.1",10001);
//获得输出流
OutputStream out = s.getOutputStream();
Writer = new BufferedWriter(new OutputStreamWriter(out));
reader = new BufferedReader(new InputStreamReader(System.in));
String line=null;
while (true){
line= reader.readLine();//读取每行
Writer.write(line);
Writer.newLine();
Writer.flush();
if("exit".equals(line)){
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(Writer!=null){
Writer.close();
}
if(s!=null){
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.演示结果
TCP服务端启动
TCP客户端启动
客户端与服务端交互信息展示
客户端发送。。。
服务端接收啦。。。。。yyds
三、基于DUP协议进行通信
1.优点
UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。
2.创建SocketService服务端
注意IP、端口号信息。服务端ip端口
public class FuWuSocket_UDP {
public static void main(String[] args) {
DatagramSocket socket=null;
try {
socket=new DatagramSocket(10000);
//创建一个字节书数组
byte[] bt=new byte[1024];
//创建数据包
DatagramPacket pk=new DatagramPacket(bt,bt.length);
System.out.println("DUP服务端启动啦。。。。");
while (true){
//接受数据。。。阻塞状态
socket.receive(pk);
//获取客户端IP
InetAddress inetAddress=pk.getAddress();
//获取数据
byte[] by=pk.getData();
//获取数据包长度
int Length= pk.getLength();
String str=new String(by,0,Length);
System.out.println(inetAddress.getHostAddress()+"接受的数据是"+str);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(socket!=null){
socket.close();
}
}
}
}
3.创建Socket客户端
注意IP、端口号信息
public class KeHuSocket_DUP {
public static void main(String[] args) {
//创建客户端udp的socket
DatagramSocket socket=null;
BufferedReader bufferedReader=null;
try {
//系统控制台输入数据
bufferedReader= new BufferedReader(new InputStreamReader(System.in));
socket=new DatagramSocket();
String str=null;
while((str=bufferedReader.readLine()) != null){
if("exie".equals(str)){
break;
}
byte[] bs=str.getBytes();
//创建数据包
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(), InetAddress.getByName("127.0.0.1"),10000);
//发送数据
socket.send(dp);
}
System.out.println("退出客户端");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(bufferedReader!=null){
bufferedReader.close();
}
if(socket!=null){
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.演示结果
DUP服务端启动。。。。。
DUP客户端启动。。。。。
DUP客户端与DUP服务端交互信息展示
DUP客户端发送。。。
服务端接收啦。。。。。yyds
总结
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。