Java之TCP和UDP代码实例

来源:互联网 发布:绍兴网络电视台 跃马 编辑:程序博客网 时间:2024/06/05 07:23

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





原创粉丝点击