问题:编写一个网络应用程序,有客户端和服务端,客户端向服务端发送一个字符串(如"Hello Socket"),服务器收到该

字符串后将其打印到命令行上,然后向客户端返回该字符串的长度,最后,客户端输出服务器端返回的该字符串的长度,

分别用TCP和UDP两种方式去实现。

Socket通信流程:

实现代码如下:

TCP:

package scoket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* 服务端Socket
*/
public class TCPServer { public static void main(String[] args) throws IOException {
// 创建服务端socket,绑定端口号为65000
ServerSocket socket = new ServerSocket(65000);
// 构建一个死循环,用来监听并处理客户端请求
while (true) {
// 接收一个客户端请求,封装为一个Socket对象
// 此时处于阻塞状态
Socket s = socket.accept(); // 处理收到的请求
// 获取客户端输入流
InputStream in = s.getInputStream();
// 获取客户端输出流
OutputStream out = s.getOutputStream();
// 定义用于存客户端信息的变量
byte[] buff = new byte[1024];
// 从输入流中读取数据
int length = in.read(buff);
// 将字节流转化为字符串并在控制台打印
String content = new String(buff, 0, length);
System.out.println(content); // 将数据长度转化为字节流并写入输出流
out.write(String.valueOf(length).getBytes()); // 关闭相关流以及socket
out.close();
in.close();
s.close();
}
}
}
package scoket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; /**
* TCP客户端Socket
*/
public class TCPClient { public static void main(String[] args) throws IOException {
// 创建Socket,并指明要连接的服务器IP和端口
Socket socket = new Socket("127.0.0.1", 65000);
// 获取socket输入流与输出流
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
// 客户端将指定字符串写入流
out.write(new String("Hello Socket").getBytes());
// 客户端接收服务器发送的字符串长度并打印
byte[] buff = new byte[1024];
int length = in.read(buff);
String content = new String(buff, 0, length);
System.out.println(content); // 关闭相关的流以及Socket
in.close();
out.close();
socket.close();
}
}

UDP:

package scoket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; /**
* UDP客户端Socket
*/
public class UDPServer { public static void main(String[] args) throws IOException {
// 创建服务端Socket并绑定端口
DatagramSocket socket = new DatagramSocket(65001);
// 定义存储客户端信息的变量
byte[] buff = new byte[1024];
// 将信息封装为一个Packet
DatagramPacket packet = new DatagramPacket(buff, buff.length);
socket.receive(packet); // 从packet中取出真正的数据
byte[] data = packet.getData();
// 处理字节流数据并打印
String content = new String(data, 0, packet.getLength());
System.out.println(content);
// 服务端向客户端发送数据报
byte[] length = String.valueOf(packet.getLength()).getBytes();
// 定义新的数据报,并将原客户端的IP和端口封装进数据报中
DatagramPacket lengthPacket = new DatagramPacket(length, length.length,
packet.getAddress(), packet.getPort());
// 发送数据给客户端
socket.send(lengthPacket);
}
}
package scoket;

import java.io.IOException;
import java.net.*; /**
* UDP客户端Socket
*/
public class UDPClient { public static void main(String[] args) throws IOException {
// 创建客户端Socket
DatagramSocket socket = new DatagramSocket();
// 封装数据报,并绑定IP和端口
InetAddress address = InetAddress.getByName("127.0.0.1");
// 创建数据信息
byte[] info = "Hello Socket".getBytes();
DatagramPacket packet = new DatagramPacket(info, info.length, address, 65001);
// 发送数据给服务端
socket.send(packet); // 接收服务端发来的信息
byte[] buff = new byte[1024];
DatagramPacket lengthPacket = new DatagramPacket(buff, buff.length);
socket.receive(lengthPacket); // 取得真正的信息
byte[] data = lengthPacket.getData();
String content = new String(data, 0, data.length);
System.out.println(content);
}
}

值得注意的是,运行代码时,必须先启动Server,再启动Client

简单Socket网络通信的更多相关文章

  1. Socket 网络通信

    Socket 网络通信 1.OSI (Open System Interconnect Reference Model)(开放系统互联参考模型) 从下低到高 :物理层.数据链路层.网络层.传输层.会话 ...

  2. Socket网络通信之BIO

    Socket网络通信之BIO 如果要让两台计算机实现通信,需要的条件:ip,port,协议. 目前我们用的最多的就是TCP/IP协议和UDP协议.TCP三次握手,所以比较慢,且安全:UDP速度快,但是 ...

  3. Socket网络通信之NIO

    Socket网络通信之NIO NIO:new io ,java1.4开始推出的可非阻塞IO. java.nio 包,可解决BIO阻塞的不足 但比BIO学习.使用复杂. 可以以阻塞.非阻塞两种方式工作. ...

  4. java实现最基础的socket网络通信

    一.网络通信基础 网络中存在很多的通信实体,每一个通信实体都有一个标识符就是IP地址. 而现实中每一个网络实体可以和多个通信程序同时进行网络通信,这就需要使用端口号进行区分. 二.java中的基本网络 ...

  5. 基于java的简单Socket编程

    1TCP协议与UDP协议     1.1 TCP               TCP是(Tranfer Control Protocol)的简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输 ...

  6. Socket网络通信编程(二)

    1.Netty初步 2.HelloWorld 3.Netty核心技术之(TCP拆包和粘包问题) 4.Netty核心技术之(编解码技术) 5.Netty的UDP实现 6.Netty的WebSocket实 ...

  7. socket网络通信

    1.socket通常也称作"套接字",用于描述IP地址和端口.在internet上的主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上 ...

  8. C# socket编程实践——支持广播的简单socket服务器

    在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...

  9. 简单Qt网络通信

    最近要用到Qt的Socket部分,网上关于这部分的资料都比较复杂,我在这总结一下,把Socket的主要部分提取出来,实现TCP和UDP的简单通信. 1.UDP通信 UDP没有特定的server端和cl ...

随机推荐

  1. 猴子吃桃问题(Java递归实现)

    猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只剩下 ...

  2. opencv学习之路(35)、SURF特征点提取与匹配(三)

    一.简介 二.opencv中的SURF算法接口 三.特征点匹配方法 四.代码 1.特征点提取 #include "opencv2/opencv.hpp" #include < ...

  3. 数据挖掘领域十大经典算法之—SVM算法(超详细附代码)

    https://blog.csdn.net/fuqiuai/article/details/79483057

  4. Python3 tkinter基础 Radiobutton 设置相同的value值,产生连锁效果

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  5. 什么时候使用“RCC_APBXPeriph_AFIO”

    什么时候需要开启复用时钟: (1)使用EXTI (2)重映射(用到外设的重映射功能时才需要使能AFIO的时钟) 举例:重映射USART2 USART2的TX/RX在PA.2/3.但是,PA.2已经被T ...

  6. 如何在Windows上的Jupyter Notebook中安装和运行PySpark

    When I write PySpark code, I use Jupyter notebook to test my code before submitting a job on the clu ...

  7. WebPack命令执行的时候,其内部处理逻辑是什么

    1.首先webpack发现并没有通过命令的形式,给它指定入口和出口 2.向根目录查找“webpack.config.js”配置文件 3.解析这个配置文件,并得到配置文件中导出的配置对象 4.当拿到配置 ...

  8. 用shell统计表格数据

    今天有个人问了这样一个问题,图片是原题,在这个题的基础上写了一个实现方法 首先日志存到a.txt文本里,如下 Zhangsan|lisi1|0|Zhangsan|lisi2|10|Zhangsan|l ...

  9. 集训队日常训练20181201 E 1005 : 小蝌蚪

    时间限制(普通/Java):500MS/1500MS     内存限制:65536KByte总提交: 25            测试通过:5 描述 有 n 个装着小蝌蚪的水缸排成一排,你拥有一个无限 ...

  10. HTTP请求头和响应头部包括的信息有哪些?(转)

    转载自:https://www.cnblogs.com/hxc555/p/6506154.html 每个HTTP请求和响应都会带有相应的头部信息.默认情况下,在发送XHR请求的同时,还会发送下列头部信 ...