知识大全 Java中的TCP/UDP网络通信编程
Posted 知
篇首语:生活的理想,就是为了理想的生活本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java中的TCP/UDP网络通信编程相关的知识,希望对你有一定的参考价值。
Java中的TCP/UDP网络通信编程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
是回路地址 用于测试 相当于localhost本机地址 没有网卡 不设DNS都可以访问
端口地址在 ~ 之间 其中 ~ 之间的端口是用于一些知名的网络服务和应用 用户的普通网络应用程序应该使用 以上的端口
网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议) TCP是面向连接的通信协议 UDP是无连接的通信协议
Socket连接套接字 Java分别为TCP和UDP提供了相应的类 TCP是 ServerSocket(用于服务器端)和 Socket(用于客户端);UDP是 DatagramSocket
Java编写UDP网络程序
DatagramSocket
DatagramSocket有如下构造方法:
DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口
DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口
DatagramSocket(int port InetAddress laddr):创建数据报套接字 将其绑定到指定的本地地址 即指定网卡发送和接收数据
如果在创建DatagramSocket对象时 没有指定网卡的IP 地址 在发送数据时 底层驱动程序会自动选择一块网卡去发送 在接收数据时 会接收所有的网卡收到的与端口一致的数据
发送信息时 可以不指定端口号 接收信息时 要指定端口号 因为要接收指定的数据
发送数据使用DatagramSocket send(DatagramPacket p)方法 接收数据使用DatagramSocket receive(DatagramPacket p)方法
DatagramPacket
DatagramPacket类有如下构造方法:
DatagramPacket(byte[] buf int length):构造 DatagramPacket 用来接收长度为length的数据包
DatagramPacket(byte[] buf int length InetAddress address int port):构造数据报包 用来将长度为length的包发送到指定主机上的指定端口号
接收数据时使用第一次构造方法 发送数据时使用第二种构造方法
InetAddress
Java中对IP地址进行包装的类
DatagramPacket getAddress()可以获取发送或接收方的IP地址 DatagramPacket getPort()可以获取发送或接收方的端口
UDP程序例子
发送程序:
import DatagramPacket;
import DatagramSocket;
import InetAddress;
public class UdpSend
public static void main(String[] args) throws Exception
DatagramSocket ds = new DatagramSocket();
String str = hello world! ;
DatagramPacket dp = new DatagramPacket(str getBytes() str length() InetAddress getByName( ) );
ds send(dp);
ds close(); //关闭连接
接收程序:
import DatagramPacket;
import DatagramSocket;
public class UdpRecv
public static void main(String[] args) throws Exception
DatagramSocket ds = new DatagramSocket( );
byte[] buf = new byte[ ];
DatagramPacket dp = new DatagramPacket(buf buf length);
ds receive(dp);
String str = new String(dp getData() dp getLength());
System out println(str);
System out println( IP: + dp getAddress() getHostAddress() + PORT: + dp getPort());
ds close();
测试要先运行接收程序 再运行发送程序 如果接收程序没有接收到数据 则会一直阻塞 接收到数据后才会关闭程序 如果网络上没有数据发送过来 接收程序也没有阻塞 通常都是使用了一个已经被占用的端口
Java编写TCP网络程序
ServerSocket
编写TCP网络服务程序 首先要用到 ServerSocket类用以创建服务器Socket 它的常用构造方法有:
ServerSocket(int port):创建绑定到特定端口的服务器套接字
ServerSocket(int port int backlog):利用指定的backlog(服务器忙时保持连接请求的等待客户数量) 创建服务器套接字并将其绑定到指定的本地端口号
ServerSocket(int port int backlog InetAddress bindAddr):使用指定的端口 侦听 backlog 和要绑定到的本地 IP 地址创建服务器
Socket
客户端要与服务器建立连接 必须先创建一个Socket对象 它的常用构造方法有:
Socket(String host int port):创建一个流套接字并将其连接到指定主机上的指定端口号
Socket(InetAddress address int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号
Socket(InetAddress address int port InetAddress localAddr int localPort):创建一个套接字并将其连接到指定远程端口上的指定远程地址
Socket(String host int port InetAddress localAddr int localPort):创建一个套接字并将其连接到指定远程主机上的指定远程端口
对于通常情况的应用 使用第 个构造方法来创建客户端的Socket对象 并与服务器建立连接 是非常简单和方便的
服务器端程序调用ServerSocket accept方法等待客户端的连接请求 一旦accept接收了客户端连接请求 该方法返回一个与该客户端建立了专线连接的Socket对象 不用程序去创建这个Socket对象 建立了连接的两个Socket是以IO流的方式进行数据交换的 Java提供了Socket getInputStream返回Socket的输入流对象 Socket getOutputStream返回Socket的输出流对象
TCP程序例子的服务器程序:
import java io InputStream;
import java io OutputStream;
import ServerSocket;
import Socket;
public class TcpServer
public static void main(String[] args) throws Exception
ServerSocket ss = new ServerSocket( );
Socket s = ss accept();
InputStream ips = s getInputStream();
OutputStream ops = s getOutputStream();
ops write( hello World! getBytes());
byte[] buf = new byte[ ];
int len = ips read(buf);
System out println(new String(buf len));
ips close();
ops close();
s close();
ss close();
在这个程序里 创建了一个在 端口上等待连接的ServerSocket对象 当接收到一个客户的连接请求后 程序从与这个客户建立了连接的Socket对象中获得输入输出流对象 通过输出流首先向客户端发送一串字符 然后通过输入流读取客户端发送过来的信息 并将这些信息打印 然后关闭所有资源
要先运行服务器程序 然后才能运行客户端程序 当TCP服务器程序运行到Socket accpet()方法等待客户连接时 accept方法将阻塞 一直到有客户连接请求到来 该方法才会返回 如果又没有请求到来 又没有发生阻塞 通常都是使用了一个已经被占用的端口
我们可以使用windows提供的telnet工具在命令行窗口中测试一下服务器程序:命令如下:telnet localhost
可以看到 telnet只要有输入就发送 因此我们如果想要在服务器端一次读多个字符的话 还需要进一步处理 看如下代码:
import java io BufferedReader;
import java io InputStream;
import java io InputStreamReader;
import java io OutputStream;
import ServerSocket;
import Socket;
public class TcpServer
public static void main(String[] args) throws Exception
ServerSocket ss = new ServerSocket( );
Socket s = ss accept();
InputStream ips = s getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ips)); //对InputStream进行包装 增加了缓存
OutputStream ops = s getOutputStream();
ops write( hello World! getBytes());
System out println(br readLine());
br close(); //关闭包装类 会自动关闭里面的基类
ops close();
s close();
ss close();
再次使用telnet工具可以看到 这次可以发送不止一个字符了 按回车键后发送数据到服务器端
TCP程序例子改进后的服务器程序:
大多数情况下 服务器端都要服务多个客户端 但一次accept方法调用只接收一个连接 因此 要把accept方法放在一个循环语句中 这样就可以接收多个连接 每个连接的数据交换代码也放在一个循环中 这样才能保证两者可以不停地交换数据
每个连接的数据交换代码必须放在独立的线程中运行 否则 这在段代码运行期间 就没法执行其他的程序代码 accept方法也得不到调用 新的连接无法进入
下面是一个例子 客户端向服务器发送一个字符串 服务器将这个字符串中的所有字符反向排列后回送给客户端 客户端输入 quit 退出程序
import java io BufferedReader;
import java io DataOutputStream;
import java io InputStream;
import java io InputStreamReader;
import java io OutputStream;
import ServerSocket;
import Socket;
public class TcpServer
public static void main(String[] args) throws Exception
ServerSocket ss = new ServerSocket( );
while(true)
Socket s = ss accept();
new Thread(new Servicer(s)) start();
class Servicer implements Runnable
Socket s;
public Servicer(Socket s)
this s = s;
public void run()
try
InputStream ips = s getInputStream();
OutputStream ops = s getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos = new DataOutputStream(ops);
while(true)
String strWord = br readLine();
if(strWord equalsIgnoreCase( quit ))
break;
String strEcho = (new StringBuffer(strWord) reverse() toString());
dos writeBytes(strWord + > + strEcho + System getProperty( line separator ));
br close();
dos close();
s close();
catch(Exception e)
e printStackTrace();
TCP程序例子客户端程序:
import java io BufferedReader;
import java io DataOutputStream;
import java io InputStream;
import java io InputStreamReader;
import java io OutputStream;
import InetAddress;
import Socket;
public class TcpClient
public static void main(String[] args) throws Exception
if(args length < )
System out println( Usage:java TcpClient ServerIP ServerPort );
return ;
Socket s = new Socket(InetAddress getByName(args[ ]) Integer parseInt(args[ ]));
InputStream ips = s getInputStream();
OutputStream ops = s getOutputStream();
BufferedReader brKey = new BufferedReader(new InputStreamReader(System in));
DataOutputStream dos = new DataOutputStream(ops);
BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
while(true)
String strWord = brKey readLine();
dos writeBytes(strWord + System getProperty( line separator ));
if( quit equalsIgnoreCase(strWord))
break;
else
System out println(brNet readLine());
dos close();
brNet close();
brKey close();
s close();
先运行服务器程序 再在命令行使用java TcpClient 这样就启动了客户端程序 我们可以启动多个客户端程序
cha138/Article/program/Java/hx/201311/26522相关参考
Java中的Socket编程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Socket是网络上
知识大全 Java网络编程-Java Socket编程(五)
Java网络编程-JavaSocket编程(五) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 Java网络编程-Java Socket编程(一)
Java网络编程-JavaSocket编程(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 Java网络编程-Java Socket编程(二)
Java网络编程-JavaSocket编程(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 Java网络编程-Java Socket编程(四)
Java网络编程-JavaSocket编程(四) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 Java网络编程-Java Socket编程(三)
Java网络编程-JavaSocket编程(三) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!li
Java网络编程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 网络编程作为Java的主要应用之
Java学习---网络编程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 网络模型OSI的网络模
Java编程那些事儿9——网络编程基础[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 对于
Java编程那些事儿9——网络编程基础[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 端口