简单Socket网络通信
问题:编写一个网络应用程序,有客户端和服务端,客户端向服务端发送一个字符串(如"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网络通信的更多相关文章
- Socket 网络通信
Socket 网络通信 1.OSI (Open System Interconnect Reference Model)(开放系统互联参考模型) 从下低到高 :物理层.数据链路层.网络层.传输层.会话 ...
- Socket网络通信之BIO
Socket网络通信之BIO 如果要让两台计算机实现通信,需要的条件:ip,port,协议. 目前我们用的最多的就是TCP/IP协议和UDP协议.TCP三次握手,所以比较慢,且安全:UDP速度快,但是 ...
- Socket网络通信之NIO
Socket网络通信之NIO NIO:new io ,java1.4开始推出的可非阻塞IO. java.nio 包,可解决BIO阻塞的不足 但比BIO学习.使用复杂. 可以以阻塞.非阻塞两种方式工作. ...
- java实现最基础的socket网络通信
一.网络通信基础 网络中存在很多的通信实体,每一个通信实体都有一个标识符就是IP地址. 而现实中每一个网络实体可以和多个通信程序同时进行网络通信,这就需要使用端口号进行区分. 二.java中的基本网络 ...
- 基于java的简单Socket编程
1TCP协议与UDP协议 1.1 TCP TCP是(Tranfer Control Protocol)的简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输 ...
- Socket网络通信编程(二)
1.Netty初步 2.HelloWorld 3.Netty核心技术之(TCP拆包和粘包问题) 4.Netty核心技术之(编解码技术) 5.Netty的UDP实现 6.Netty的WebSocket实 ...
- socket网络通信
1.socket通常也称作"套接字",用于描述IP地址和端口.在internet上的主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上 ...
- C# socket编程实践——支持广播的简单socket服务器
在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...
- 简单Qt网络通信
最近要用到Qt的Socket部分,网上关于这部分的资料都比较复杂,我在这总结一下,把Socket的主要部分提取出来,实现TCP和UDP的简单通信. 1.UDP通信 UDP没有特定的server端和cl ...
随机推荐
- vue-loader的理解
1.vue-loader是webpack的加载器,允许以单文件组件(SFC)的格式创作Vue组件 2.允许对Vue组件的每个部分使用其他webpack加载器 3.允许.vue文件中的自定义块可以应用自 ...
- .eslintrc文件配置
{ // 环境定义了预定义的全局变量. "env": { //环境定义了预定义的全局变量.更多在官网查看 "browser": true, "node ...
- mongo 修改器
[$inc] 作用:修改器$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作. Example: db.b.update({"uid" : "2 ...
- 利用python抓取页面数据
1.首先是安装python(注意python3.X和python2.X是不兼容的,我们最好用python3.X) 安装方法:安装python 2.安装成功后,再进行我们需要的插件安装.(这里我们需要用 ...
- 利用递归解决“汉诺塔的移动”问题(使用python来做的,其它语言也行)
有a,b,c三个柱子,n个盘子. def move(n, a, b, c): if n == 1: print('move', a, '-->', c) else: move(n-1, a, c ...
- Spring history、design philosophy (Spring的历史及设计理念)
一,Spring的发展史 1,Spring1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和x ...
- Java基础学习-流程控制语句
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的.也就是说程序的流程对运行结果有直接的影响.所以,我们必须清楚每条语句的执行流程.而且,很多时候我们要通过控制语句的执行顺序来实现我 ...
- leetcode实战
leetcode记录 两数之和 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案. ...
- [译]RabbitMQ教程C#版 - 远程过程调用(RPC)
先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...
- vi编辑器使用记录
01. vi 简介 1.1 学习 vi 的目的 在工作中,要对 服务器 上的文件进行 简单 的修改,可以使用 ssh 远程登录到服务器上,并且使用 vi 进行快速的编辑即可 常见需要修改的文件包括: ...