UDP
udpsend.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* 实现UDP协议的发送端:
* 实现封装数据的类:java.net.DatagramPacket
* 实现数据传输的类:java.net.DatagramSocket
*
* 实现步骤:
* 1.创建DatagramPacket对象,封装数据和接收端的地址和端口
* 2.创建DatagramSocket
* 3.调用DatagramSocket类方法send,发送数据包
* 4.关闭资源
*
* DatagramPacket构造方法:
* DatagramPacket(byte[] buf, int length, InetAddress address, int port)
* 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
*
* DatagramSocket构造方法
* DatagramSocket()空参数
* 方法:void send(DatagramPacket p) 从此套接字发送数据报包。
*/
public class udpsend {
public static void main(String[] args) throws IOException {
//创建数据包对象,封装要发送的数据包和接收端的IP和端口
byte[] date = "你好UDP".getBytes();
//创建InetAddress对象,封装自己的IP地址
InetAddress inet = InetAddress.getByName("127.0.0.1");
DatagramPacket dp = new DatagramPacket(date,date.length,inet,6000);
//创建DatagramSocket对象,调用send方法发送数据包
DatagramSocket ds = new DatagramSocket();
ds.send(dp);
ds.close();
}
}
udpreceive.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* 实现UDP接收端
* 实现封装数据的类:java.net.DatagramPacket
* 实现数据传输的类:java.net.DatagramSocket
*
* 实现步骤:
* 1.创建DatagramSocket对象,绑定一个端口号
* 2.创建一个字节数组,准备接收对方发来的数据
* 3.创建数据包对象DatagramPacket//DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为 length 的数据包。
* 4.调用DatagramSocket的方法void receive(DatagramPacket p)
* 5.拆包
* 发送的IP地址 InetAddress getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
* 接收到的字节个数 DatagramPacket 中方法 int getLength()
* 发送方的端口号 int getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
* 6.关闭资源
*/
public class udpreceive {
public static void main(String[] args)throws IOException {
//创建数据包传输对象DatagramSocket,绑定端口号
DatagramSocket ds = new DatagramSocket(6000);
byte[] data = new byte[1024];
DatagramPacket dp = new DatagramPacket(data,data.length);
ds.receive(dp);
//获取接收到的字节个数
int length = dp.getLength();
//获取发送端的IP地址对象
String ip = dp.getAddress().getHostAddress();
System.out.println(ip);
//获取发送端的端口号
int port = dp.getPort();
System.out.println(port);
System.out.println(new String(data,0,length));
ds.close();
}
}
TCP
tcpserver.java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 实现TCP的服务器程序
* 表示服务器程序的类为ServerSocket,在java.net.ServerSocket
* ServerSocket的构造方法:
* ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
*
* 方法:
* 必须获得客户端套接字对象Socket
* Socket accept() 侦听并接受到此套接字的连接。
*
*/
public class tcpservice {
public static void main(String[] args)throws IOException {
ServerSocket server = new ServerSocket(8888);
//调用服务器套接字对象中的方法accept()获得客户端的套接字对象
Socket socket = server.accept();
//调用客户端套接字socket的InputStream获取字节输入流,读取的是客户端发送的数据
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));
//服务器向客户端回数据,使用字节输出流,并通过客户端套接字对象获取字节输出流
OutputStream out = socket.getOutputStream();
out.write("数据已查收".getBytes());
socket.close();
server.close();
}
}
tcpclient.java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
* 实现TCP客户端,连接到服务器端,和服务器端实现数据交换
* 实现TCP客户端的类在java.net.Socket
*
* Socket构造方法
* Socket(String host, int port)创建一个流套接字并将其连接到指定主机上的指定端口号。
*
* Socket方法
* OutputStream getOutputStream() 返回此套接字的输出流。即输出到服务器
* InputStream getInputStream() 返回此套接字的输入流。 即写入到客户端
* 客户端服务器数据交换,必须使用套接字对象Socket中的获取的IO流,自己new的流则不行。
*
*/
public class tcpclient {
public static void main(String[] args)throws IOException {
//创建Socket对象,连接服务器
Socket socket = new Socket("127.0.0.1",8888);
//通过客户端套接字对象Socket方法,获取字节输出流,将数据写向服务器
OutputStream out = socket.getOutputStream();
out.write("服务器OK".getBytes());
//客户端读取服务器端回送的数据,同样通过字节输入流将数据读取进来
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int len = in.read(data);
System.out.println(new String(data,0,len));
socket.close();
}
}
使用TCP上传文件实例
tcpserver.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
/*
* tcp图片上传服务器
* 1.ServerSocket套接字对象,监听端口8000
* 2.方法accpet()获取客户端的连接对象
* 3.客户端连接对象获取字节输入流,读取客户端发送的图片
* 4.创建Fiel对象,绑定上传文件夹,判断文件夹是否存在,
* 5.创建字节输出流,数据目的File对象所在文件夹
* 6.字节流读取图片,字节流将图片写入到目的文件夹
* 7.上传成功写入客户端
* 8.关闭资源
*/
public class tcpserver {
public static void main(String[] args)throws IOException {
ServerSocket server = new ServerSocket(8000);
Socket socket = server.accept();
InputStream in = socket.getInputStream();
//将目的文件夹封装到File对象
File upload = new File("d:\\upload");
if(!upload.exists()){
upload.mkdirs();
}
//为防止文件同名被覆盖,从新定义文件名字
//规则:域名+毫秒值+6位随机数
String filename = "TCPIP"+System.currentTimeMillis()+ new Random().nextInt()+".jpg";
FileOutputStream fos = new FileOutputStream(upload+File.separator+filename);
byte[] bytes = new byte[1024];
int len = 0;
while((len = in.read(bytes))!=-1){
fos.write(bytes,0,len);
}
socket.getOutputStream().write("上传成功".getBytes());
fos.close();
socket.close();
server.close();
}
}
tcpclient.java
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
* 实现TCP的图片上传客户端
* 实现步骤
* 1.socket套接字连接服务器
* 2.通过socket获取字节输出流传输图片
* 3.使用自己的流对象,读取图片数据源FileInputStream
* 4.读取图片,使用字节输出流,将图片写到服务器采用字节数组进行缓冲
* 5.通过socket套接字获取字节输入流,读取服务器发回来的上传成功信息
* 6.关闭资源
*/
public class tcpclient {
public static void main(String[] args)throws IOException {
Socket socket = new Socket("127.0.0.1",8000);
OutputStream out = socket.getOutputStream();
FileInputStream fis = new FileInputStream("C:\\1.jpg");
int len = 0;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
out.write(bytes,0,len);
}
socket.shutdownOutput();
//获取字节数入流读取服务器发回来的上传成功信息
InputStream in = socket.getInputStream();
len = in.read(bytes);
System.out.println(new String(bytes,0,len));
socket.close();
fis.close();
}
}
文件上传案例多线程版本
服务器端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class tcpthreadserver {
public static void main(String[] args)throws IOException {
ServerSocket server = new ServerSocket(8000);
while(true){
Socket socket = server.accept();
new Thread(new upload(socket)).start();
}
}
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Random;
public class upload implements Runnable{
private Socket socket;
public upload(Socket socket){this.socket=socket;}
public void run(){
try{
InputStream in = socket.getInputStream();
//将目的文件夹封装到File对象
File upload = new File("d:\\upload");
if(!upload.exists()){
upload.mkdirs();
}
//为防止文件同名被覆盖,从新定义文件名字
//规则:域名+毫秒值+6位随机数
String filename = "TCPIP"+System.currentTimeMillis()+ new Random().nextInt()+".jpg";
FileOutputStream fos = new FileOutputStream(upload+File.separator+filename);
byte[] bytes = new byte[1024];
int len = 0;
while((len = in.read(bytes))!=-1){
fos.write(bytes,0,len);
}
socket.getOutputStream().write("上传成功".getBytes());
fos.close();
socket.close();
}catch(IOException ex){
System.out.println(ex);
System.out.println("上传失败");
}
}
}