很多朋友对于socket服务器端和j*a中用socket实现客户端与服务端双向连接问题不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

一、socket是什么呀

套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。

一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议*数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。

套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。

可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。

套接字通常和同一个域中的套接字*数据(数据*也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Inter协议簇来进行通信。

Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。

通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。

Socket是由IP和端口结合的,提供向应用层进程传送数据包的机制。

类型

1、数据报套接字

无连接套接字,使用用户数据报协议(UDP)。在数据报套接字上发送或接收的每个数据包都单独寻址和路由。数据报套接字不能保证顺序和可靠*,因此从一台机器或进程发送到另一台机器或进程的多个数据包可能以任何顺序到达或可能根本不到达。在数据报套接字上发送广播可能需要特殊配置。

为了接收广播数据包,数据报套接字不应该绑定到特定,尽管在某些实现中,当数据报套接字绑定到特定时也可能接收广播数据包。

2、流套接字

面向连接的套接字,使用传输控制协议(TCP)、流控制传输协议(SCTP)或数据报拥塞控制协议(DCCP)。流套接字提供了无记录边界的有序且独特的无错误数据流,并具有用于创建和销毁连接以及报告错误的明确定义的机制。

流套接字以带外功能可靠地、有序地传输数据。在 Inter上,流套接字通常使用 TCP实现,以便应用程序可以使用 TCP/IP协议在任何网络上运行。

3、原始套接字

允许发送和接收 IP数据包,无需任何特定于协议的传输层格式。对于其他类型的套接字,根据选择的传输层协议(例如 TCP、UDP)自动封装有效载荷,并且套接字用户不知道与有效载荷一起广播的协议头的存在。从原始套接字读取时,通常包含标头。

从原始套接字传输数据包时,自动添加标头是可选的。

大多数套接字应用程序编程接口(API),例如基于Berkeley套接字的那些,支持原始套接字。Windows XP于 2001年发布,在Winsock接口中实现了原始套接字支持,但三年后,微软出于安全考虑限制了 Winsock的原始套接字支持。

原始套接字用于与安全相关的应用程序,如Nmap。原始套接字的一个用例是在用户空间中实现新的传输层协议。

原始套接字通常在网络设备中可用,用于路由协议,例如Inter组管理协议(IGMP)和开放最短路径优先(OSPF),以及用于Inter控制消息协议(ICMP)等事情,由ping实用程序。

以上内容参考百度百科-套接字

二、j*a中用socket实现客户端与服务端双向连接问题

//服务端程序:

importj*a.io.*;

importj*a..*;

publilassTCPServer{

publicstaticvoidmain(String[]args)throwsIOException{

newTCPServer().init();

}

@SuppressWarnings("static-aess")

privatevoidinit()throwsIOException{

@SuppressWarnings("resource")

ServerSocketserver=newServerSocket(1000);

Socketclient=null;

while(true){

try{

client=server.aept();

BufferedInputStreambis=newBufferedInputStream(client.getInputStream());

byte[]b=newbyte[1024];

intlen=0;

Stringmessage="";

while((len=bis.read(b))!=-1){

message=newString(b,0,len);

System.out.print("客户端:"+client.getIAddress().getLocalHost().getHostAddress()+"发来消息:"+message);

if("byte".equals(message.trim()))

client.close();

PrintWriterpw=newPrintWriter(client.getOutputStream(),true);

pw.println(message);

}

}catch(Exceptione){

System.err.println("客户端:"+client.getIAddress().getLocalHost().getHostAddress()+"已断开连接!");

}

}

}

}

//客户端程序:

importj*a.io.*;

importj*a..Socket;

publilassTCPClientimplementsRunnable{

publicstaticvoidmain(String[]args)throwsIOException{

newTCPClient().init();

}

privatevoidinit()throwsIOException{

@SuppressWarnings("resource")

finalSocketclient=newSocket("127.0.0.1",1000);

BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));

Stringsend="";

while(true){

send=in.readLine();

PrintWriterout=newPrintWriter(client.getOutputStream(),true);

if(!"byte".equals(send.trim()))

socket服务器端 j*a中用socket实现客户端与服务端双向连接问题

out.println(send);

else{

out.println(send);

System.exit(0);

}

newThread(newTCPClient(){

@SuppressWarnings("static-aess")

publicvoidrun(){

try{

BufferedInputStreambis=newBufferedInputStream(client.getInputStream());

byte[]b=newbyte[1024];

intlen=0;

while((len=bis.read(b))!=-1){

System.out.println("服务器:"+client.getIAddress().getLocalHost().getHostAddress()+"发来消息:"+newString(b,0,len).trim());

}

}catch(IOExceptione){

System.err.println("连接服务器失败!");

}

}

}).start();

}

}

publicvoidrun(){}

}

//服务器测试结果:

客户端:192.168.0.200发来消息:001 byte

客户端:192.168.0.200发来消息:byte

客户端:192.168.0.200已断开连接!

客户端:192.168.0.200发来消息:adasd

客户端:192.168.0.200已断开连接!

//客户端测试结果:

---001号客户端--

001byte

服务器:192.168.0.200发来消息:001byte

byte//001礼貌说跟服务器说byte

---002号客户端--

adasd//002客户端关闭程序

服务器:192.168.0.200发来消息:adasd

三、如何使用socket进行客户端和服务器端的通信

完成后,软件是一个单独的运行程序,可以打开软件。

3

软件的界面很简单,在左侧有tcp和udp的客户端或服务端的快捷按钮,上方有【创建】【删除】【退出】等选项按钮。

4

我们先来建立TCP的测试服务端。【TCP Server】再【创建】。

选择一个监听端口,这里我们使用6001作为服务端的监听端口。

建立完成后,服务端会自动启动,软件会显示【启动监听】的状态。

我们可以检测一下本机的6001端口是否已经打开。在DOS窗口中输入命令【stat-a】,可以在列表中看到本机的6001端口的状态为listening的状态,表示本机的6001端口正处于监听的状态。

在DOS窗口中输入命令【tel 192.168.0.140 6001】来登录本地的6001端口。

回车键,就可以成功登录6001端口。在测试软件中就可以看到状态是已连接的状态,同时也可以看到对方的ip就是本地ip。

再来测试通信情况,在DOS窗口中输入a、b、c,在软件的接收窗口就可以看到收到的数据了。

在软件的发送窗口中输入1234567890,发送后,在DOS窗口中就可以看到软件发送过来的数据了。

测试完成后,在软件中【停止监听】,同时在DOS窗口中可以看到【失去了跟主机的连接】,表示测试连接已经断开。

再来创建TCP的客户端,【TCP Client】再【创建】。会弹出【创建socket客户端】窗口,输入对方的ip和对方的端口,确认。

tcp的客户端已经建立好,如果对方的端口监听正常的话,【连接】就可以连接到对方的端口和对方进行测试通信了。