Java之TCP和UDP代码实例

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("上传失败");
		}
		

	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值