java 网络流 TCP/UDP
一、ServerSocket
java.lang.Object |-java.net.ServerSocket
有子类SSLServerSocket。
| 此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。 |
常用构造方法:
ServerSocket(int port) 创建绑定到特定端口的服务器套接字
常用方法:
Socket accept() 侦听并接受到此套接字的连接 void bind( SocketAddress endpoint) 将ServerSocket绑定到特定地址(IP地址和端号) void close() 关闭套接字 InetAddress getInetAddress() 返回此服务器套接字的本地地址 int getLocalPort() 返回此套接字在其上侦听的端口
二、Socket
Java.lang.Object
|-java.net.Socket
常用构造方法:
Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
常用方法:
void bind(SocketAddress bindpoint) 将套接字绑定到本地地址
void close() 关闭此套接字
void connect(SocketAddress endpoint) 将此套接字连接到服务器。 void connect(SocketAddress endpoint, int timeout) 将此套接字连接到服务器,并指定一个超时值 InetAddress getInetAddress() 返回套接字连接的地址。
InputStream getInputStream() 返回此套接字的输入流。
OutputStream getOutputStream() 返回此套接字的输出流。
int getPort() 返回此套接字连接到的远程端口。
void shutdownInput() 此套接字的输入流置于“流的末尾”。
void shutdownOutput() 禁用此套接字的输出流。
三、DatagramSocket
Java.lang.Object
|-java.net.DatagramSocket
常用构造方法:
|
DatagramSocket(int port) |
|
|
DatagramSocket(int port, InetAddress laddr) |
常用方法:
应当注意的是,该类既能发送数据包也能接受数据包
|
void |
bind(SocketAddress addr) |
|
void |
close() |
|
void |
connect(InetAddress address, int port) |
|
void |
connect(SocketAddress addr) |
|
getInetAddress() |
|
|
void |
receive(DatagramPacket p) |
|
void |
send(DatagramPacket p) |
四、DatagramPacket
Java.lang.Object
|-java.net.DatagramPacket
常用构造方法:
|
构造方法摘要 |
|
|
DatagramPacket(byte[] buf, int length) |
|
|
DatagramPacket(byte[] buf, int length, InetAddress address, int port) |
|
|
DatagramPacket(byte[] buf, int length, SocketAddress address) |
|
常用方法:
|
getAddress() |
|
|
int |
getPort() |
|
void |
setAddress(InetAddress iaddr) |
|
void |
setData(byte[] buf, int offset, int length) |
|
void |
setPort(int iport) |
|
void |
setSocketAddress(SocketAddress address) |
五、简单TCP应用实例:
一 服务端小写转大写服务
服务端程序:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; /**
* 这是服务端程序
* @author kuangdaoyizhimei
*
*/
public class Server
{
public static void main(String args[]) throws IOException
{
ServerSocket ss=new ServerSocket(7894);
Socket s=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"已连接。");
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
String str=null;
while((str=br.readLine())!=null)
{
System.out.println(str);
pw.println(str.toUpperCase());//注意println方法的使用在这里是必须的,否则会产生死锁
}
s.close();
ss.close();
}
}
客户端程序:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 这是客户端程序。
* @author kuangdaoyizhimei
*
*/
public class Client
{
public static void main(String args[]) throws UnknownHostException, IOException
{
Socket s=new Socket("192.168.1.101",7894);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedReader bin=new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
String str=null;
while((str=br.readLine())!=null)
{
pw.println(str);
String result=bin.readLine();
System.out.println(result);//注意println方法的使用在这里是必须的,否则会产生死锁
}
s.close();
}
}
运行结果:
服务端运行结果:

客户端运行结果:

二、简单UDP服务演示:局域网群聊小程序
程序使用的广播地址是192.168.1.255,每个客户端的接收端口是6544。
程序中使用了多线程技术。
package p01.UDPTransferDemo.p01.UDPTransferDemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* 接收线程ReceiveThread
* @author kuangdaoyizhimei
*/
class ReceiveThread implements Runnable
{
DatagramSocket ds=null;
public ReceiveThread(DatagramSocket ds)
{
this.ds=ds;
}
@Override
public void run()
{
while(true)
{
try
{
byte buf[]=new byte[1024];
//2.创建接收数据报
DatagramPacket dp=new DatagramPacket(buf, buf.length);
ds.receive(dp);
//3.显示数据报信息
System.out.println(dp.getAddress().getHostAddress()+":"+dp.getPort()+":"+new String(dp.getData(),0,dp.getLength()));
}
catch(IOException e)
{
System.out.println("接受线程产生异常!");
}
}
}
}
/**
* 发送线程SendThread
* @author kuangdaoyizhimei
*
*/
class SendThread implements Runnable
{
DatagramSocket ds=null;
public SendThread(DatagramSocket ds)
{
this.ds=ds;
}
@Override
public void run()
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
try {
while((str=br.readLine())!=null)
{
try
{
//2.创建发送数据包。
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.1.255"),6544);
//3.发送数据包
ds.send(dp);
}
catch(IOException e)
{
System.out.println("发送线程产生异常!");
}
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 主类UDPTransferDemo
* @author kuangdaoyizhimei
*
*/
public class UDPTransferDemo {
public static void main(String args[]) throws IOException
{
DatagramSocket Send=new DatagramSocket();
DatagramSocket Receive=new DatagramSocket(6544);
new Thread(new ReceiveThread(Receive)).start();
new Thread(new SendThread(Send)).start();
}
}

三、TCP应用之文本文件上传
在和源文件同一个文件夹中预先准备一个文本文件aim.txt,里面内容自定义。
服务端程序:
package p04.TCPUpperLoadFileDemo.p01.TCPUpperLoadTextFileDemo; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket; public class TCPUpperLoadServer {
public static void main(String args[]) throws IOException
{
ServerSocket ss=new ServerSocket(9876);
Socket s=ss.accept();
InputStream is=s.getInputStream();
BufferedReader brIn=new BufferedReader(new InputStreamReader(is));
OutputStream os=s.getOutputStream();
BufferedWriter bwOut=new BufferedWriter(new OutputStreamWriter(os));
String str=null;
File file=new File("副本.txt");
BufferedWriter bw=new BufferedWriter(new FileWriter(file));
while((str=brIn.readLine())!=null)
{
System.out.println(str);
bw.write(str);
bw.newLine();//此处换行是为了写到文件的换行
bw.flush();
}
bw.close();
bwOut.write("上传成功!");
bwOut.flush();
s.close();
}
}
客户端程序:
package p04.TCPUpperLoadFileDemo.p01.TCPUpperLoadTextFileDemo; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPUpperLoadClient { public static void main(String[] args) throws UnknownHostException, IOException
{
Socket socket=new Socket("192.168.209.1",9876);
InputStream is=socket.getInputStream();
BufferedReader brIn=new BufferedReader(new InputStreamReader(is));
OutputStream os=socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
File file=new File("aim.txt");
FileReader fr=new FileReader(file);
BufferedReader br=new BufferedReader(fr);
String str=null;
while((str=br.readLine())!=null)
{
bw.write(str);
bw.newLine();//此处换行是为了给服务器端读取一行的结束标记。
bw.flush();
}
socket.shutdownOutput();//没有这一句话两端将都处于等待状态。
br.close();
str=brIn.readLine();
System.out.println(str);
}
}
运行结果:



四、TCP应用之媒体文件上传
准备:aim.mp4文件,放在和源代码文件同一个目录下
客户端:
package p04.TCPUpperLoadFileDemo.p02.TCPUpperLoadMultipleFileDemo; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPUpperLoadMultipleFileClient { public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket=new Socket("192.168.209.1",9876);
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
byte buf[]=new byte[1024];
File file=new File("aim.mp4");
FileInputStream fis=new FileInputStream(file);
int length=0;
while((length=fis.read(buf))!=-1)
{
os.write(buf, 0, length);
os.flush();
}
fis.close();
socket.shutdownOutput(); /**
* 显示上传状态信息
*/
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String str=br.readLine();
System.out.println(str);
socket.close();
} }
服务端:
package p04.TCPUpperLoadFileDemo.p02.TCPUpperLoadMultipleFileDemo; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPUpperLoadMultipleFileServer { public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(9876);
Socket socket=ss.accept();
InputStream is=socket.getInputStream();
OutputStream os=socket.getOutputStream();
FileOutputStream fos=new FileOutputStream(new File("副本.mp4"));
byte buf[]=new byte[1024];
int length=-1;
while((length=is.read(buf))!=-1)
{
fos.write(buf, 0, length);
fos.flush();
}
fos.close();
os.write("文件上传成功!".getBytes());
socket.close();
ss.close();//服务器一般不关闭,这里只是用于演示,所以关闭。
}
}
运行结果:

五、TCP应用之QQ群聊
客户端之输入端:
/**
* 此程序模拟QQ输入
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPTransferQQImitateClient { public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("这是用户信息输入窗口:");
Socket socket=new Socket("192.168.209.1",8080);
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os,true);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
while((str=br.readLine())!=null)
{
if(str.equals("over"))
{
break;
}
pw.println(str);
}
br.close();
pw.close();
socket.shutdownOutput();
socket.close();
}
}
客户端之接收端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 此程序模拟群聊输出
* @author kuangdaoyizhimei
*
*/
public class ReceiveInformationClient { public static void main(String[] args) throws IOException {
System.out.println("这是群聊显示窗口:");
ServerSocket ss=new ServerSocket(8000);
while(true)
{
Socket s=ss.accept();
InputStream is=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String str=null;
str=br.readLine();
System.out.println(str);
}
}
}
服务端之用户接入端:
/**
* 此程序模拟服务器处理用户接入
*/
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.HashSet; public class TransmitServer {
public static void main(String[] args) throws IOException {
System.out.println("这是服务器处理多线程窗口:");
ServerSocket ss=new ServerSocket(8080);
HashSet<String>hs=new HashSet<String>();
while(true)
{
Socket socket=ss.accept();
System.out.println("用户"+socket.getInetAddress().getHostName()+"接入!");
Thread thread=new Thread(new ClientHandle(socket,hs));
thread.start();
}
}
}
服务端之转发端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.HashSet;
/**
* 此程序模拟服务器处理单个用户的线程接入和数据转发。
* @author kuangdaoyizhimei
*
*/
public class ClientHandle implements Runnable {
private Socket socket;
private HashSet<String>list;
public ClientHandle(Socket socket, HashSet<String> list) {
this.socket=socket;
this.list=list;
} @Override
public void run() {
System.out.println("这是服务器处理单线程窗口:(核心窗口)");
try
{
list.add(socket.getInetAddress().getHostAddress());
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String ip=socket.getInetAddress().getHostAddress();
int port=socket.getPort();
String str=ip+":"+port+" :";
String temp=null;
while((temp=br.readLine())!=null)
{
for(String s:list)
{
Socket sk=new Socket(s,8000);
OutputStream osm=sk.getOutputStream();
PrintWriter pw=new PrintWriter(osm,true);
pw.println(str+temp);
sk.close();
}
}
}
catch(IOException e)
{
System.out.println("用户"+socket.getInetAddress().getHostAddress()+"退出!");
}
}
}
运行结果:

java 网络流 TCP/UDP的更多相关文章
- java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端
java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...
- TCP/UDP client/server library for Java, 最好的java语言tcp udp 服务器客户端实现库
这个库andrdoi也可以用,而且是基于类的使用方式: 它支持类似聊天室的功能,即一个人说话,所有客户端都能收到,当然也支持点点通信.它还支持 RMI 的方式调用远程过程. https://githu ...
- Java中的TCP/UDP网络通信编程
127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...
- Java 网络编程(二) 两类传输协议:TCP UDP
链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951841.html 两类传输协议:TCP,UDP TCP TCP是Transfer C ...
- Java TCP/UDP网络通信编程
本文转自:http://www.cnblogs.com/cdtarena/archive/2013/04/10/3012282.html 网络应用中基本上都是TCP(Transmission Cont ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- TCP/UDP套接字 java socket编程实例
网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. ...
- 4.Java网络编程之TCP/UDP
常见传输协议: UDP , TCP UDP协议: 特点: 1.将数据及源和目的封装成数据包中,不需要建立连接 2.每个数据包的大小限制在64K内 ...
- java scoket http TCP udp
http://blog.csdn.net/kongxx/article/details/7259436 TCP/UDP: 齐全:http://www.blogjava.net/Reg/archive/ ...
随机推荐
- 互联网开发-web文件上传性能问题
1. 问题描述 文件大小 部署环境 平均上传速度 5M 外网 28s-36s 5M 公司局域内网 秒传,很快 2. 问题分析 在网上搜索“测速网”测试了一下公司外网的带宽情况: 上传带宽 = 1.04 ...
- window.open()总结
今天找父页面和子页面调去问题. 父页面js 1.打开子页面 可以设置子页面长宽高和位置 win= window.open(url, "", "top=45,left=20 ...
- oracle序列的缓存
在高并发的数据库系统中,序列的缓存也要相应的调大.现在看看数据库自己的一个高并发序列的定义. 当我们向数据库发送一个请求时,监听接待,然后oracle会启动一个后台进程(这个进程就是通常所说的数据库并 ...
- app内部H5测试点总结
1.业务逻辑 除基本功能测试外,需要关注的一些测试点: a.登录 a.1 H5页面嵌入到客户端使用,若客户端已经登录,进入H5页面应该是登录状态 a.2 H5页面嵌入到客户端内使用,若客户端未登录,如 ...
- Hive学习(三)Hive的Java客户端操作
Hive的Java客户端操作分为JDBC和Thrifit Client,首先启动Hive远程服务: hive --service hiveserver 一.JDBC 在MyEclipse中首先创建连接 ...
- RTT之AT命令组件
包含客户端和服务器:用于GPRS和3G的通讯命令格式.四种基本功能 测试功能:AT+<x>=? 用于查询命令参数格式及取值范围: 查询功能:AT+<x>? 用于返回命令参数当前 ...
- @enable跟@import注解
参考文章: 讲@import的相关内容:https://blog.csdn.net/u012437781/article/details/78626134 讲为什么registrar没有注入:http ...
- 实现Nginx中使用PHP-FPM时记录PHP错误日志的配置方法
最近在本地搭建的LNMP的开发环境.为了开发的时候不影响前端的正常开发就屏蔽的PHP里面php.ini中的一些错误提示.但是这样一来,就影响到了后端开发的一些问题比如不能及时调试开发中的一些问题 ng ...
- PHP函数库(core)
数组函数: array_change_key_case — 返回字符串键名全为小写或大写的数组 array_change_key_case() 将 input 数组中的所有键名改为全小写或大写.改变是 ...
- c# 远程连接sql server 2008问题
http://hi.baidu.com/lzghxjt/item/d42bd8f7066a3ad86325d280 远程连接不上可以在防火墙新建入站规则