1、使用UDP协议实现通信功能
服务器端程序
package LESSON13; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class UDPserver { /** * 接受数据 DatagramPacket(byte[] buf, int offset, int length) 构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。 */ public static void main(String[] args) throws Exception { DatagramSocket server = new DatagramSocket(8888);//创建服务器 byte b[]=new byte[1024]; //DatagramPacket(byte[] buf, int length) //构造 DatagramPacket,用来接收长度为 length 的数据包。 DatagramPacket dp=new DatagramPacket(b,b.length); System.out.println(1); server.receive(dp);//阻塞 System.out.println(2); //解析数据 // byte[] getAddress() 返回此 InetAddress 对象的原始 IP 地址。 InetAddress address=dp.getAddress(); //byte[] getData() 返回数据缓冲区。 byte data[]=dp.getData(); //int getLength() 返回将要发送或接收到的数据的长度。 int length=dp.getLength(); // String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。 System.out.println("sender:"+address.getHostAddress()); System.out.println(new String(data).trim()+"\t"+length); server.close(); } }
客户端程序
package LESSON13; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketException; public class UDPclient { /** *DatagramSocket() 创建Socet对象并随机分配端口号 *DatagramSocket(int port) 创建Socet对象并指定端口号 发送数据 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。 */ public static void main(String[] args) throws Exception { //创建客户端 DatagramSocket client = new DatagramSocket(); //InetAddress 此类表示互联网协议 (IP) 地址。 //static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。 InetAddress address=InetAddress.getByName("localhost");//获取本地IP地址 byte b[]="我是客户端".getBytes(); DatagramPacket dp=new DatagramPacket(b,b.length,address,8888);//把数据打包 client.send(dp);//发送数据包 client.close();//关闭 } }
先运行服务端,虚拟灯一直亮着等待客户端发送数据
再运行客户端,然后回到服务端console
2、使用TCP是实现服务与客户端通信
服务端程序
package LESSON13; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class TCPserver { /** 使用TCP接收数据 创建接收端Socket对象 监听(阻塞) 获取输入流对象 获取数据 输出数据 释放资源 ServerSocket此类实现服务器套接字。 ServerSocket(int port) 创建绑定到特定端口的服务器套接字 * @throws Exception */ public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(9999);// 创建接收端Socket对象 Socket s = server.accept();//监听(阻塞)等待连接 //通信 InputStream in=s.getInputStream();// 获取输入流对象(接收数据) byte b[]=new byte[1024]; in.read(b);//接收客户端发来的信息 OutputStream out=s.getOutputStream();//获取输出流对象(发送数据) out.write("你好,我是服务器".getBytes());//向客户端发送信息 // InetAddress getInetAddress() 返回套接字连接的地址。 InetAddress address = s.getInetAddress(); System.out.println("client"+"\t"+address.getHostAddress()); System.out.println(new String(b).trim()); in.close(); s.close(); //ss.close(); } }
客户端程序
package LESSON13; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; public class TCPclient { /** 使用TCP发送数据 创建发送端Socket对象(创建连接) 获取输出流对象 发送数据 释放资源 Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 Exception in thread "main" java.net.ConnectException: Connection refused: connect * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub InetAddress address=InetAddress.getByName("localhost");//获取本地IP地址 Socket client=new Socket(address, 9999);//创建发送端Socket对象(创建连接) //通信 OutputStream out=client.getOutputStream();//获取输出流对象(发送数据) out.write("服务器你好,我是客户端".getBytes());//发送数据 InputStream in=client.getInputStream();//获取输入流睡醒(接收数据) byte b[]=new byte[1024]; in.read(b);//接收服务器发送来的信息 System.out.println(new String(b).trim()); out.close(); client.close(); } }
先运行服务端,再运行客户端
原文:https://www.cnblogs.com/qfdy123/p/11100320.html