udp双向通信的问题

udp双向通信的问题,第1张

首先,UDP和TCP均指通信协议,那么,既然代表通信协议,UDP和TCP都是建立一个“通道”就可以进行服务端/客户端间的数据收发。
它们的区别主要在于:
UDP协议是面向非连接(不可靠)的传输协议,也就是不需要与服务端建立连接,就直接将数据发送给服务端,同时,无机制保证这条数据已成功发送给服务端。
TCP协议是面向连接(可靠)的传输协议,在客户端向服务器端传输数据之前,客户端必须与服务器端通过“三次握手”来完成连接的建立,在之后的数据传输过程中,为了可靠传输,接受方还会发送ACK包来使发送方获知该数据包已经成功发送,否则,发送端将重新发送数据包直至超时或发送成功。
因此,无论UDP协议还是TCP协议,均要有一个服务端先行监听某端口才能服务。
例如:服务端监听9090端口,客户端使用3456(随机分配)端口,与服务器建立连接,那么通道只有一条,即:A:9090 <-> B:3456。
希望可以帮助你!

直接上代码,仅供参考,具体 tcp、udp的通信原理很容易找到。
TCP服务器端代码:
try {
Boolean endFlag = false;
ServerSocket ss = new ServerSocket(12345);
while (!endFlag) {
// 等待客户端连接
Socket s = ssaccept();
BufferedReader input = new BufferedReader(newInputStreamReader(sgetInputStream()));
//注意第二个参数据为true将会自动flush,否则需要需要手动 *** 作outputflush()
PrintWriter output = newPrintWriter(sgetOutputStream(),true);
String message = inputreadLine();
Logd("Tcp Demo", "message from Client:"+message);
outputprintln("message received!");
//outputflush();
if("shutDown"equals(message)){
endFlag=true;
}
sclose();
}
ssclose();
} catch (UnknownHostException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
TCP客户端代码:
try {
Socket s = new Socket("localhost", 12345);
// outgoing stream redirect to socket
OutputStream out = sgetOutputStream();
// 注意第二个参数据为true将会自动flush,否则需要需要手动 *** 作outflush()
PrintWriter output = new PrintWriter(out, true);
outputprintln("Hello IdeasAndroid!");
BufferedReader input = new BufferedReader(newInputStreamReader(s
getInputStream()));
// read line(s)
String message = inputreadLine();
Logd("Tcp Demo", "message From Server:" + message);
sclose();
} catch (UnknownHostException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
下面我们看看UDP:
UDP服务器端代码:
// UDP服务器监听的端口
Integer port = 12345;
// 接收的字节大小,客户端发送的数据不能超过这个大小
byte[] message = new byte[1024];
try {
// 建立Socket连接
DatagramSocket datagramSocket = new DatagramSocket(port);
DatagramPacket datagramPacket = new DatagramPacket(message,
messagelength);
try {
while (true) {
// 准备接收数据
datagramSocketreceive(datagramPacket);
Logd("UDP Demo", datagramPacketgetAddress()
getHostAddress()toString()
+ ":" + new String(datagramPacketgetData()));
}
} catch (IOException e) {
eprintStackTrace();
}
} catch (SocketException e) {
eprintStackTrace();
}
UDP客户端代码:
public static void send(String message) {
message = (message == null "Hello IdeasAndroid!" : message);
int server_port = 12345;
DatagramSocket s = null;
try {
s = new DatagramSocket();
} catch (SocketException e) {
eprintStackTrace();
}
InetAddress local = null;
try {
// 换成服务器端IP
local = InetAddressgetByName("localhost");
} catch (UnknownHostException e) {
eprintStackTrace();
}
int msg_length = messagelength();
byte[] messagemessageByte = messagegetBytes();
DatagramPacket p = new DatagramPacket(messageByte, msg_length, local,
server_port);
try {
ssend(p);
} catch (IOException e) {
eprintStackTrace();
}
}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10883763.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-12
下一篇2023-05-12

发表评论

登录后才能评论

评论列表(0条)

    保存