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 ...
随机推荐
- Ubunut PPA源概述
Ubuntu 自带的“软件”应用,可以安装海量软件,既包括发行者支持的软件.社区支持的软件,也包括专有驱动和版权软件.有时,我们需要的软件通过这些渠道仍然无法找到.这时,可以到 PPA 软件源中查找. ...
- 【Django】视图系统
目录 FBV 与 CBV 给视图加装饰器 使用装饰器装饰CBV 关于dispatch()方法 Request对象 与 Response对象 request对象 response对象 @ *** 一个视 ...
- Android手机使用WIFI及USB建立FTP服务器总结
想必大家经常在PC和Android之间传输文件,并不是每次都会插USB接口进行文件传输,就算是插上USB接口,还是有个问题,那就是Android打开大容量存储模式之后,经常很多软件就会被强制停止使用, ...
- python + eclipse + django + postgresql 开发网站(一)
一.配置开发环境 1.安装Python 载地址下:http://www.python.org/getit/
- 62.C++文件操作list实现内存检索,实现两千万数据秒查
1 #include <iostream> #include <fstream> #include <cstdlib> #include <string> ...
- 使用Java语言开发微信公众平台(六)——获取access_token
在前四期的文章中,我们分别学习了“环境搭建与开发接入”.“文本消息的接收与响应”.“被关注回复与关键词回复”.“图文消息的发送与响应”等环节.那么,从本篇博文开始,我们将进去更高级的 ...
- 修改url中某个参数
function changeURLArg(url,arg,arg_val){ var pattern=arg+'=([^&]*)'; var replaceText=arg+'='+arg_ ...
- tomcat日志配置之一自带log
问题 tomcat每次启动时,自动在logs目录下生产以下日志文件,且每天都会生成对应日期的一个文件,造成日志文件众多: localhost.2012-07-05.txt catalina.2012- ...
- 国内搜索大哥iOS面试题
每一次面试之后都会对问到的面试题进行总结. 这篇总结的是我面试某大型搜索公司的iOS面试题.一面(15min)+二面(30min).并拿到实习offer.当然在今天这个特殊的节日,祝大家新年快乐.希望 ...
- C语言之文件操作06——写数据到文本文件遇0停止
//文件 /* =============================================================== 题目:输入10个篮球运动员的身高数据(cm)保存至D盘文 ...