您的位置:首页 > 理论基础 > 计算机网络

简单的tcp与udp通信 java代码

2017-12-14 15:14 337 查看
在网络编程中,有UDP与TCP这么两种协议,其主要的区别是TCP是安全的,不会丢失数据包,但效率比较低;UDP是不安全的,其容易丢失数据包,但是传输的效率比较高。在显示的应用中,不涉及money的传输一般都是使用UDP的,下面我将使用java代码编写简单的UDP与TCP通信的例子;

(1)UDP

UDP通信的时候,客户端往服务器发送消息时是不需要确认服务器端是否存在或者工作是否正常的,它只管发送,不管反馈。

客户端代码如下:

package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UdpClient {
public static void main(String[] args) {
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket();
String str = "我是客户端,要发送消息";
byte[] buf = str.getBytes();
int port = 8080;//服务器端的端口
String ip = "10.20.59.197";//服务器端的ip地址
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length, InetAddress.getByName(ip), port);
datagramSocket.send(datagramPacket);
System.out.println("给服务端发送数据");
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(datagramSocket != null){
datagramSocket.close();
}
}

}
}

关闭socket连接最好在finally中进行,以防止发生异常。此时没有服务器端时,启动客户端也不会报任何错误。

服务器端代码如下:

package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer {
public static void main(String[] args) {
int port = 8080;
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(port);
byte[] buf = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
datagramSocket.receive(datagramPacket);
String str = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println("接收到客户端的数据:" + str);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(datagramSocket != null){
datagramSocket.close();
}
}

}
}


(2)TCP
TCP通信的时候,客户端往服务器发送消息时需要进行三次“握手”操作,以确保服务器端正常。

客户端代码如下:

package socket;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {
public static void main(String[] args) {
Socket socket = null;
String ip = "10.20.59.197";
int port = 8080;
try {
//ip:服务器端的ip地址,port:服务器端的端口
socket = new Socket(ip, port);
OutputStream outputStream = socket.getOutputStream();
String str = "我是客户端,请求向服务器发送请求";
byte[] buf = str.getBytes();
outputStream.write(buf);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}


此时如果在没有服务器端的情况下启动客户端是会报异常,异常信息如下:



这个异常表示,服务器端不正常工作,无法接收客户端发送的数据,所以在TCP通信时需要先开启服务器端;

服务器端代码如下:

package socket;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
public static void main(String[] args) {
int port = 8080;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
//服务器端开启后,会一直在port这个端口上等待,直到有客户端请求连接
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
byte[] buf = new byte[1024];
int length = inputStream.read(buf);
String str = new String(buf, 0, length);
System.out.println("接收到客户端的消息:" + str);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(serverSocket != null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
}


serverSocket.accept()这个方法是阻塞的,正式的环境中,这边应该是个死循环,然后每次有客户端连接上之后,服务器就启动一个线程来处理这个客户端的任务,而自己则会继续去port这个端口上等待下一个客户端连接,这边我写的比较简单。

以上是自己的一些见解,如有错误,欢迎指正,谢谢!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: