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();

}

}

udp模拟tcp java_Java简单实现UDP和TCP相关推荐

  1. 基于TCP的简单服务器

    基于Tcp的简单服务器 UDP协议无连接类似于发微信 TCP协议有链接类似于打电话 所以基于TCP的服务器先要到内核中获取一个TCP连接,UDP不需要获取连接 TCP的连接管理是由操作系统的内核来管理 ...

  2. NS 2.35 柯志亨书-实验3笔记-TCP UDP模拟

    上图是笔记 下面是tcl代码: View Code #Create a simulator object set ns [new Simulator]#Set different color for ...

  3. UDP 分片 与 丢包,UDP 真的比 TCP 高效吗?

    关注.星标公众号,直达精彩内容 素材来源:https://blog.csdn.net/LearnLHC/article/details/115268028 整理:技术让梦想更伟大 | 李肖遥 一.UD ...

  4. UDP 分片 与 丢包,UDP 真的比 TCP 高效吗?UDP 的应用场景

    目录 一.UDP 报文格式 二.UDP 分片 1.UDP 有发送缓存区吗? 1>.先说结论: 2>.逐步分析: 2.UDP 分片 1>.UDP 包最佳传输大小 2>.分片问题 ...

  5. 网络攻城狮怎么看待TCP/IP协议与UDP协议?

    在互联网中,存在着各种不同层次的协议,它们分别的功能也是不同的.但做为网络攻城狮,对这些协议的使用以及区分是工作的必备技能.那今天以网络攻城狮的角度来告诉大家攻城狮是怎么看待TCP/IP协议与UDP协 ...

  6. TCP/IP协议与UDP协议的区别

    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇.里面 ...

  7. TCP/IP的初步理解,TCP和UDP的区别

    1.什么是TCP/IP协议 TCP/IP协议是一个协议簇.里面包括很多协议的.UDP只是其中的一个.之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他俩命名了. TCP/IP ...

  8. 的udp的接收端如何看速率_计算机网络 TCP与UDP

    本文记录了阅读<图解TCP/IP>的<TCP与UDP>章节的笔记. 一.传输层的作用 当IP协议根据IP地址发送数据到了目标计算机上,但是具体要发给哪个应用程序还没有确定.传输 ...

  9. ftp用的是tcp还是udp_TCP与UDP的区别究竟在哪

    TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认.窗口.重传.拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源. TCP的缺 ...

最新文章

  1. TI IPNC Web网页之网页修改教程
  2. ubuntu mysql 5.7.19_在Ubuntu19下安装Mysql-5.7.24
  3. GAN生成的结果多样性不足怎么办?那就再添一个鉴别器!
  4. python中set函数是什么数据类型_Python基本数据类型之set
  5. Windows 下 Redis 服务无法启动,错误 1067 进程意外终止解决方案
  6. 如何使用QXDM 的1477项 转化utc时间
  7. 怎样音频转文字?用这些音频转文字免费版就可以啦
  8. linux设计论文题目,计算机linux本科毕业论文题目
  9. steam远程畅玩无法连接远程计算机,Steam 如何进行远程畅玩?
  10. 知识图谱从入门到应用——知识图谱的知识表示:向量表示方法
  11. 对于导入UE4中的模型坐标原点不在物体中心的解决办法
  12. 原生JS实现各种运动之匀速运动
  13. 融易投3周年庆——欢乐送豪礼
  14. Android 使用第三方SDK 一般流程
  15. java get_JAVA 中get()和get()的用法,和意义?
  16. 【Day_09】走方格的方案数
  17. 计算机学报是期刊论文吗,《计算机学报》北大核心电子期刊发表技巧
  18. java,jbutton
  19. 笔记本WIN7建立共享wifi的简单方法
  20. 图文笔记,带你走进《未来简史》(26-30)

热门文章

  1. 如何将多个一维列表转化为二维列表_数据分析2_如何处理一维、二维数据
  2. php从网页获得数据,php根据URL获得网页内容
  3. java8新特性_JAVA8十大新特性详解
  4. kotlin 16进制_Kotlin程序将八进制数转换为十进制数
  5. JavaScript中的If和Else语句(香草)
  6. List 集合去重的 3 种方法
  7. 局部变量竟然比全局变量快 5 倍?
  8. asp.net 取windows的所有进程
  9. haskell程序设计语言
  10. 五、QPushButton按钮和QLineEdit控件操作