【CSDN常见问题解答】Java Socket通信(TCP/UDP)

来源:互联网 发布:弱点 知乎 编辑:程序博客网 时间:2024/05/22 06:38

以前写过一个局域网通信工具,很简单的。但是这系列文章是用来解决新手问题的。所以打算写个最简单的demo。

废话少说,先来个基于TCP的。

上server端代码:

import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket; public class MyServiceSocket {     public static void main(String[] args) {        try {            // 1.建立一个服务器socket对象            ServerSocket ss = new ServerSocket(8888);             // 2.等待客户端连接            Socket s = ss.accept();// 等到客户端连接             // 通过输入输出流操作数据            InputStream is = s.getInputStream();            DataInputStream dis = new DataInputStream(is);            System.out.println(dis.readUTF());             OutputStream out = s.getOutputStream();            DataOutputStream dos = new DataOutputStream(out);            dos.writeUTF("hello client!");             // 4.关闭数据流            dis.close();            is.close();            s.close();            ss.close();        } catch (Exception e) {            e.printStackTrace();        }    } }

客户端代码:

import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket; public class MyClient {     public MyClient() {    }     public static void main(String[] args) {        try {            // 1.建立Socket对象            Socket client = new Socket("localhost", 8888);             // 2.通过socket对象的输入输出流操作数据            OutputStream out = client.getOutputStream();            DataOutputStream dos = new DataOutputStream(out);            dos.writeUTF("hello service!");             InputStream is = client.getInputStream();            DataInputStream dis = new DataInputStream(is);            System.out.println(dis.readUTF());             System.out.println(client.getInetAddress());            System.out.println(client.getLocalPort());            System.out.println(client.getLocalSocketAddress());            System.out.println(client.getChannel());            // 3.关闭连接            dos.close();            out.close();            client.close();        } catch (Exception e) {            e.printStackTrace();        }    } }

再来一个基于UDP的。

server端代码:

import java.net.DatagramPacket;import java.net.DatagramSocket; public class MyUDPServer {     public static void main(String[] args) {        byte b[] = new byte[100];        try {             DatagramPacket dp = new DatagramPacket(b, b.length);            DatagramSocket ds = new DatagramSocket(8888);             ds.receive(dp);            String s = "你发的数据是:" + new String(b).trim();            System.out.println(s);             dp = new DatagramPacket(s.getBytes(), s.getBytes().length,                    dp.getAddress(), dp.getPort());            ds = new DatagramSocket();            ds.send(dp);         } catch (Exception e) {            e.printStackTrace();        }     }}

Client端:

import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress; /** * 类说明:UDP数据包 udp 总结 1.将要发的数据先进行打包 使用的类是:DatagramPacket 2.发送打包好的数据 * 使用的类是:DatagramSocket (发送数据包) 注意事项:发送数据报是要知道目的地和目的端口号 * 所以要采用DatagramPacket(byte[] buf, int length,InetAddress address,int port) * 因为发送的时候已经知道端口号 故发送DatagramSocket()不需要再写参数了 *  * 接收数据包: 1.接收的时候要将接受的数据打包DatagramPacket(byte[] buf, int length) * 2.接收的时候要知道重那个端口接收 故使用的时候要DatagramSocket(int prot); *  */public class MyUDPClient {    public static void main(String[] args) {        byte b[] = "hello udp server!".getBytes();        try {            InetAddress add = InetAddress.getByName("localhost");             DatagramPacket dp = new DatagramPacket(b, b.length, add, 8888);            DatagramSocket ds = new DatagramSocket();             ds.send(dp);             b = new byte[100];            dp = new DatagramPacket(b, b.length);            ds.receive(dp);            System.out.println(new String(b).trim());         } catch (Exception e) {            e.printStackTrace();        }     }}