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 ...
随机推荐
- JS 引擎基础之 Shapes and Inline Caches
阅读下面这篇文章,需要20分钟: 一起了解下 JS 引擎是如何运作的吧! JS 的运作机制可以分为 AST 分析.引擎执行两个步骤: JS 源码通过 parser(分析器)转化为 AST(抽象语法树) ...
- jquery点击弹框外层关闭弹框
$(document).bind("click",function(e){ if($( e.target ).closest(".game-cont ...
- idea中实现类快速重写service方法 快捷键
1.在实现类中 CTRL+O 快捷键,会弹出所有方法 2.选择service中的方法,会自动重写
- LRJ入门经典-0907万圣节的小L306
原题 LRJ入门经典-0907万圣节的小L306 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 今天是万圣节,小L同学开始了 ...
- 洛谷 P1719 最大加权矩形
P1719 最大加权矩形 题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她 ...
- pip的认识
一.pip与python的关系:pip并不是一种语言,而是一个Python包管理工具,主要是用于安装 PyPI 上的软件包.安装好pip之后,使用pip install 命令即可方便的安装python ...
- 闲的无聊写了个很(wu)有(liao)意(dao)思(bao)的程序
下午机房断网了 闲的无聊,写了个小游戏 忘了sleep在哪个库里了.. 自带变色效果哦 #include<iostream> #include<cstdio> #include ...
- Java生产者与消费者(上)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 生产与消费者模式,是编程中最常用的模式之一,在多线程中应用比较明显.个人理解:在自助餐厅,厨师在不断 ...
- UVALive-6485-Electric Car Rally(BFS)
题目:点击打开链接 思路:对于当前位置的每个时间段都要走一遍(除了那些须要的时间比最大同意的时间还大的),用 整形 vis[当前位置][剩余油量] 标记. #include <cstdio> ...
- windows下硬盘安装debian
windows下硬盘安装debian 此方法在 windows8.1 + debian8.7.1 可用 配置系统安装镜像 1 在windows下格式化一个fat32的分区 2 把下载的debian-7 ...