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

以前写过一个局域网通信工具,很简单的。但是这系列文章是用来解决新手问题的。所以打算写个最简单的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();
        }
 
    }
}


  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值