问题:编写一个网络应用程序,有客户端和服务端,客户端向服务端发送一个字符串(如"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中使用ssm框架的定时的实现

    1.首先需要在application.xml里面配置如下的代码: xmlns:task="http://www.springframework.org/schema/task http:// ...

  2. vue 3.0的搭建

    1. 删除以前的vue 2.x版本,并下载3.x版本 npm uninstall -g vue-cli / yarn global remove vue-cli npm install -g @vue ...

  3. 继承 派生 super()经典类 新式类

    '''1什么是继承? 继承一种新建类的方式,在python中支持一个儿子继承多个爹 新建的类称为子类的或者派生类 父类有可以称为基类或者超类 子类会‘遗传’父类的属性 2 为什么要用继承 减少代码冗余 ...

  4. freeswitch reloadxml 出错

    1.修改fs配置文件后,reloadxml控制台上报错误. 2,控制台日志显示 error near line 7301]:missing>] 查询 log 下的 freeswitch.xml. ...

  5. canvas与svg

    canvas与svg都是用于在网页上绘制图形(位图). canvas是HTML5新出来的一个标签,用来定义一块画图的区域(canvas本身没有绘制能力),用JavaScript来画图,可以绘制路径.矩 ...

  6. 微信小程序复选框实现 多选一功能

    功能实现界面 data: { checkboxItems: [ { name: '全天(1-8节)', value: 'allday' }, { name: '上午(1-4节)', value: 'a ...

  7. wireshark基础学习—第二部分wireshark的基础操作

    抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口.点击Capture Opti ...

  8. ES6解构过程添加一个默认值和赋值一个新的值

    const info = { name: 'xiaobe', } const { name: nickName = '未知' } = info; 其中nickName是解构过程中新声明的一个变量,并且 ...

  9. C# 在类中使用Timer定时器以及延时处理的方法

    我们平时在C#中要用到定时功能时,有自带定时器,一般在定时器里面写函数就行了,现在需要在类里面写了一个定时器,不和界面绑定,一开始的时候感觉没什么思路,然后看了一下界面的设计代码,有了思路,还是很简单 ...

  10. hive参数配置详细

    hive.exec.mode.local.auto 决定 Hive 是否应该自动地根据输入文件大小,在本地运行(在GateWay运行) true hive.exec.mode.local.auto.i ...