Java简单实现UDP和TCP的示例
作者:cccc_hi 时间:2021-08-02 14:57:48
TCP实现
TCP协议需要在双方之间建立连接,通过输入输出流来进行数据的交换,建立需要通过三次握手,断开需要四次挥手,保证了数据的完整性,但传输效率也会相应的降低。
简单的TCP实现
//服务端
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8886); // 建立服务端,ip为本机ip,端口为8886
Socket accept = serverSocket.accept(); // 监听客户端的连接,一旦有客户端连接,则会返回客户端对应的accept
InputStream in = accept.getInputStream(); //获取到客户端的输出流
byte b[] = new byte[1024];
int len = in.read(b);
System.out.println("接受到客户端数据,返回数据"+new String(b,0,len));
OutputStream out = accept.getOutputStream(); // 给客户端发送消息
out.write("服务端已经接受".getBytes());
serverSocket.close();
}
}
// 客户端
public class TcpClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8886); // 通过Socket来建立和服务端的连接
OutputStream out = socket.getOutputStream(); // 获取输出流(客户端输出流即向服务端输出信息)
out.write("hello tcp Server".getBytes()); // 输出信息
InputStream in = socket.getInputStream(); // 接受服务端的消息
byte b[] = new byte[1024];
int len = in.read(b);
System.out.println("接受到服务器消息 : "+new String(b,0,len)); // 输出
out.write("返回的的数据已经收到 ".getBytes()); // 向服务器返回消息
socket.close();
}
}
改进服务端,启用多线程来接受客户端的数据
// server
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8886); // 建立服务端,ip为本机ip,端口为8886
int i=4;
while(i>2){
Socket accept = serverSocket.accept(); // 监听客户端的连接,一旦有客户端连接,则会返回客户端对应的accept
ServerThread st = new ServerThread(accept); // 启动线程
Thread th = new Thread(st);
th.start();
}
serverSocket.close();
}
// thread
public class ServerThread implements Runnable {
private Socket accept;
public ServerThread(Socket s) {
this.accept = s;
}
public void run(){
InputStream in;
try {
in = accept.getInputStream();
byte b[] = new byte[1024];
int len = in.read(b);
System.out.println("接受到客户端数据,返回数据" + new String(b, 0, len));
OutputStream out = accept.getOutputStream(); // 给客户端发送消息
out.write("服务端已经接受".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
传递图片
// 服务端
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(5555);
Socket ss = serverSocket.accept();
BufferedInputStream br = new BufferedInputStream(ss.getInputStream());
BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("copy.jpg")); // 写出文件流
byte b[] = new byte[1024];
int len = 0;
while ((len = br.read(b)) != -1) { // 写出文件
bw.write(b, 0, len);
bw.flush(); // 别忘了刷新,要不然最后一块缓冲区字符串会缺失
}
BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream())); // 输出
bw2.write("图片传输成功");
bw2.flush();
bw.close();
ss.close();
}
}
// 客户端
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 5555);
BufferedInputStream in = new BufferedInputStream(new FileInputStream("c.jpg"));
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
byte b[] = new byte[1024];
int len = 0;
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
out.flush(); // 刷新缓冲区 要不然最后一块缓冲区字符串会缺失
}
socket.shutdownOutput(); // 关闭流以后Server段才会接收道结束字符结束接受
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
in.close();
socket.close();
}
}
UDP实现
UDP是将数据打成数据包向对方发送,只关系是否发送成功,而不关心是否接收成功,传输速度快,但是可靠性低。
udp代码实现
// 发送端
public class SendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(); // 此类表示用来发送和接收数据报包的套接字。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 键盘输入
String line = null;
while ((line = br.readLine()) != null) {
byte[] bytes = line.getBytes();
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10005); // 数据包对象
ds.send(dp);
if ("886".equals(line)) { // 当输入886时结束发送
break;
}
}
ds.close();
}
}
// 接收端
public class ReciveDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(10005); // 建立服务端
byte bytes[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length); // 建立数据包对象
while (true) {
ds.receive(dp); // 接受数据包
byte[] data = dp.getData(); // 获取数据
String str = new String(data, 0, dp.getLength());
if ("886".equals(str)) {
break;
}
System.out.println(str);
}
ds.close();
}
}
来源:http://www.cnblogs.com/liyuhui-Z/p/7794829.html
标签:Java,UDP,TCP
0
投稿
猜你喜欢
详解SpringBoot禁用Swagger的三种方式
2022-02-28 23:49:08
springboot整合微信支付sdk过程解析
2021-12-30 22:47:29
详解Java token主流框架之JWT
2022-03-30 19:30:34
C# double和decimal数据类型以截断的方式保留指定的小数位数
2021-12-09 02:19:04
Java Property类使用详解
2023-11-06 21:52:57
Android Retrofit实现多图片/文件、图文上传功能
2021-11-01 00:23:47
一篇文章带你了解JVM垃圾回收
2023-08-06 23:42:20
c# Linq distinct不会调用Equals方法详解
2021-09-03 09:53:13
C# Winform实现进度条显示
2023-09-14 15:47:51
Android 屏幕切换监听的实例代码
2023-07-03 13:00:19
Android实现计时与倒计时的方法汇总
2023-11-09 19:29:28
Java源码解析之接口List
2022-06-13 08:46:44
java实现基于TCP协议网络socket编程(C/S通信)
2021-10-15 23:41:26
关于Java中修饰符的总结(fina除外)
2023-11-22 23:15:57
C#使用RichTextBox实现替换文字及改变字体颜色功能示例
2023-07-04 23:04:18
c#多线程之线程基础
2022-10-06 20:34:44
c#使用listbox的详细方法和常见问题解决
2023-08-27 11:28:56
Android Studio进行APP图标更改的两种方式总结
2022-02-07 09:08:40
Java创建多线程的两种方式对比
2023-09-14 21:02:49
一起聊聊Java中13种锁的实现方式
2022-11-23 15:26:00