Java网络编程之TCP、UDP
Java网络编程之TCP、UDP


版权声明:本文为博主原创文章,未经博主允许不得转载。
一、TCP网络通信
Java中使用Socket(套接字)实现TCP。服务器端使用ServerSocket类,客户端使用Socket类实现。
1、ServerSocket类
其主要有如下的方法:
ServerSocket() 创建非绑定服务器套接字。
ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
Socket accept() 侦听并接受到此套接字的连接。
void close() 关闭此套接字
boolean isClosed() 返回 ServerSocket 的关闭状态。
InetAddress getInetAddress() 返回此服务器套接字的本地地址。
void bind(SocketAddress endpoint) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
boolean isBound() 返回 ServerSocket 的绑定状态。
SocketAddress getLocalSocketAddress() 返回此套接字绑定的端点的地址,如果尚未绑定则返回 null。
服务器端每次运行是都要使用accept()方法等待客户端的连接,此方法执行之后服务器端将进入阻塞状态,知道客户端连接之后程序才继续执行,此方法返回是Socket,代表一个客户端对象。
2、Socket类
两台机器连接通信的端点。主要使用如下方法:
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
OutputStream getOutputStream() 返回此套接字的输出流。
InputStream getInputStream() 返回此套接字的输入流。
boolean isBound() 返回套接字的绑定状态。
boolean isClosed() 返回套接字的关闭状态。
boolean isConnected() 返回套接字的连接状态。
void close() 关闭此套接字。
其通过字节流和服务端进行通信。
实例一、下面是实现一个简单的TCP客户端可服务器端通信。
(1)服务器端:
- package andy.network.test;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午10:49:11
- *
- *
- */
- public class FirstTCPServer {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- //创建服务器
- ServerSocket server = null;
- Socket socket = null;
- PrintStream out = null;
- //服务器在9999上等待客户端的访问
- server = new ServerSocket(9999);
- System.out.println("服务器端已经运行,等待客户的响应。。。");
- //程序阻塞 等待客户端的访问
- socket = server.accept();
- //向客户端输出信息
- String str = "hello andy.";
- out = new PrintStream(socket.getOutputStream());
- out.print(str);
- out.close();
- socket.close();
- server.close();
- }
- }
(2)客户端:
- package andy.network.test;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.Socket;
- import java.net.UnknownHostException;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午11:02:17
- *
- *
- */
- public class FirstTCPSocket {
- /**
- * @param args
- * @throws IOException
- * @throws UnknownHostException
- */
- public static void main(String[] args) throws UnknownHostException,
- IOException {
- // 定义客户端
- Socket client = null;
- // 设置地址和端口
- client = new Socket("localhost", 9999);
- BufferedReader buf = null; // 结束服务端流
- buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
- String str = buf.readLine();
- System.out.println("服务器端通知信息:" + str);
- buf.close();
- client.close();
- }
- }
实例二
实现客户端和服务器端的通信,服务器端可以响应多个客户端,每个客户端请求就启动一个线程。
(1)服务端
- package andy.network.test;
- import java.io.IOException;
- import java.net.ServerSocket;
- import java.net.Socket;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午11:41:22
- *
- * 聊天服务器端
- */
- public class ChatServer {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- ServerSocket server = null;
- Socket client = null;
- // 监听9999端口的连接
- server = new ServerSocket(9999);
- boolean flag = true;
- while (flag) {
- System.out.println("服务器运行,等待客户端连接。");
- client = server.accept();
- // 对每一个客户端请求启动一个线程
- new Thread(new ChatThread(client)).start();
- }
- server.close();
- }
- }
对应服务端线程任务:
- package andy.network.test;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.io.PrintStream;
- import java.net.Socket;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午11:24:26
- *
- * 使用多线程机制,在每个用户响应之后启动一个新任务
- *
- */
- public class ChatThread implements Runnable {
- // 接受客户端
- private Socket client = null;
- public ChatThread(Socket client) {
- this.client = client;
- }
- @Override
- public void run() {
- // 向客户端发送数据
- PrintStream out = null;
- // 接收客户端发来的数据
- BufferedReader buff = null;
- try {
- // 得到客户端的输入信息
- buff = new BufferedReader(new InputStreamReader(
- client.getInputStream()));
- out = new PrintStream(client.getOutputStream());
- //标志是否一个客户端的操作完毕
- boolean flag = true;
- while (flag) {
- //不断的接收信息
- String str = buff.readLine();
- if(str == null || "".equals(str)){
- flag = false;//客户端操作结束
- }else{
- if("bye".equals(str)){
- flag = false;
- out.println("bye-bye");
- }else {
- //向客户端回显输入
- out.println("you input:" + str);
- }
- }
- }
- out.close();
- client.close();
- } catch (Exception e) {
- System.out.println("服务器异常!");
- }
- }
- }
(2)客户端
- package andy.network.test;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintStream;
- import java.net.Socket;
- import java.net.UnknownHostException;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 上午11:53:03
- *
- * 聊天客户端程序
- *
- */
- public class ChatClient {
- public static void main(String[] args) throws UnknownHostException,
- IOException {
- Socket client = null;
- client = new Socket("localhost", 9999);
- // 接收服务器端的信息
- BufferedReader buff = null;
- // 向服务器端发送数据
- PrintStream out = null;
- BufferedReader input = null;
- // 获取键盘输入数据
- input = new BufferedReader(new InputStreamReader(System.in));
- out = new PrintStream(client.getOutputStream());
- buff = new BufferedReader(
- new InputStreamReader(client.getInputStream()));
- // 标志位
- boolean flag = true;
- while (flag) {
- System.out.println("输入信息:");
- String str = input.readLine();
- // 向服务器端输出信息
- out.println(str);
- if ("bye".equals(str)) {
- flag = false;
- } else {
- String chatCont = buff.readLine();
- System.out.println(chatCont);
- }
- }
- client.close();
- buff.close();
- }
- }
二、UDP网络通信
TCP的通信是建立在可靠通信的基础上,UDP则是不可靠的通信,使用数据报形式发送数据。
在Java中主要有DatagramPacket和DatagramSocket实现。
1、DatagramPacket主要方法
DatagramPacket(byte[] buf, int length)
构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
byte[] getData()
返回数据缓冲区。
int getLength()
返回将要发送或接收到的数据的长度。
2、DatagramSocket主要方法
DatagramSocket(int port)
创建数据报套接字并将其绑定到本地主机上的指定端口。
void receive(DatagramPacket p)
从此套接字接收数据报包。
void send(DatagramPacket p)
从此套接字发送数据报包。
在使用UDP时,先使用客户端指定好要接受的数据和端口。然后开启服务端发送数据。
实现如下:
(1)客户端
- package andy.network.test;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 下午3:04:10
- *
- * UDP客户端
- */
- public class UDPClient {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- // 客户在9999端口监听
- DatagramSocket dSocket = null;
- dSocket = new DatagramSocket(9999);
- // 定义接收数据的字节长度
- byte[] buff = new byte[1024];
- DatagramPacket dPacket = null;
- // 指定接收数据的长度1024
- dPacket = new DatagramPacket(buff, 1024);
- System.out.println("等待接受数据。。");
- //接收数据
- dSocket.receive(dPacket);
- String str = new String(dPacket.getData(), 0, dPacket.getLength())
- + "from" + dPacket.getAddress().getHostAddress() + ":"
- + dPacket.getPort();
- System.out.println(str);
- //关闭数据报套接字
- dSocket.close();
- }
- }
(2)服务器端
- package andy.network.test;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- /**
- * @author Zhang,Tianyou
- * version:2014-11-25 下午3:13:38
- *
- * UDP服务器端
- *
- */
- public class UDPServer {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws IOException {
- DatagramSocket dSocket = null;
- //服务端在3333端口监听
- dSocket = new DatagramSocket(3333);
- DatagramPacket dPacket = null;
- //要发生的数据
- String str = "hello andy!";
- //向目标端口地址发送数据报
- dPacket = new DatagramPacket(str.getBytes(), str.length(),
- InetAddress.getByName("localhost") , 9999);
- System.out.println("发送数据报");
- dSocket.send(dPacket);
- dSocket.close();
- }
- }

Java网络编程之TCP、UDP的更多相关文章
- 4.Java网络编程之TCP/UDP
常见传输协议: UDP , TCP UDP协议: 特点: 1.将数据及源和目的封装成数据包中,不需要建立连接 2.每个数据包的大小限制在64K内 ...
- Java网络编程之TCP
Java网络编程之TCP TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...
- Java网络编程之TCP通信
一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. Server ...
- 网络编程之TCP/UDP及其流程比较(转)
TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证 具体编程 ...
- java 网络编程之TCP通信和简单的文件上传功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- java网络编程之TCP实例
Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgr ...
- Java网络编程之UDP
Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...
- Java网络编程之InetAddress浅析
Java网络编程之InetAddress浅析 一.InetAddress综述 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetA ...
随机推荐
- 【 正确使用vim编辑器的姿势】
vi:可视化接口(Visual Interface) vim:是vi的增强版(vi iMprove) vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样 ...
- springboot 前后端分离开发解决跨域访问
最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...
- 【Codeforces Round #460 (Div. 2) D】Substring
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果有环 ->直接输出-1 (拓扑排序如果存在某个点没有入过队列,说明有环->即入队的节点个数不等于n 否则. 说明可以 ...
- CSUOJ 1637 Yet Satisfiability Again!
1637: Yet Satisfiability Again! Time Limit: 5 Sec Memory Limit: 128 MB Description Alice recently s ...
- 洛谷 P1732 [TJOI2011]序列
P1732 [TJOI2011]序列 题目描述 一指数列A={a1, a2, …, an},根据数列A计算数列B={b1, b2, …, bn},其中: 求\sum\limits^n_{i=1} b_ ...
- vector与deque的区别
最重要的区别,是内部实现上.deque是分段存储的. 都是支持随机存取. http://www.cnblogs.com/zhuyf87/archive/2012/12/09/2809896.html ...
- C# 之 继承
继承 继承是OOP最重要的特性之中的一个.不论什么类都能够从还有一个类中继承,这就是说,这个类拥有它继承的类的全部成员. 在OOP中,被继承的类称为父类. 在C#中的对象仅能直接派生于一个基类 ...
- Node.js转化GBK编码 - iconv-lite
node当使用node获取GBK编码的数据时,nodejs仅仅支持utf-8,node没有提供转换编码的原生支持,有倒是有一个模块iconv能干这个事,但须要本地方法,VC++库的支持.国外有个大牛写 ...
- Nginx安装以及配置
安装编译工具及库文件 1 yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel 安装 PCRE 下载 PC ...
- 体验域名注册解析与SSL证书