>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 14056 个阅读者 刷新本主题
 * 贴子主题:  TCP、UDP及Socket代码示例 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2021-06-24 02:06:17     消息  查看  搜索  好友  邮件  复制  引用

    
  TCP的服务端在收不到消息的时候,会一直处于等待状态,核心代码:Socket accept = serverSocket.accept();

UDP的发送和接收不经过三次握手,允许存在失败丢失的情况。

1.TCP代码

1.1 服务器端

public class SocketTcpServer {
    public static void main(String[] args) throws IOException {
        // 创建Server Socket
        ServerSocket serverSocket = new ServerSocket();
        // 创建我们的 Socket 监听连接地址和端口号
        SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
        // 绑定我们的监听地址
        serverSocket.bind(address);
        // 等待接受请求
        System.out.println("等待客户端发送消息..");
// 此代码监听是否完成三次握手,如果执行完则继续,否则一直阻塞等待
        Socket accept = serverSocket.accept();
        // 获取OutputStream流
        PrintWriter socketOut = new PrintWriter(accept.getOutputStream());
        byte buf[] = new byte[1024];
        if (accept.getInputStream().read(buf) > 0) {
            System.out.println("服务器端接受到客户端消息:" + new String(buf));
        }
        // 服务器端响应消息
        String sendStr = "我是jarye";
        socketOut.write(sendStr);
        socketOut.flush();

        // 关闭所有连接
        socketOut.close();
        accept.close();
        serverSocket.close();
    }
}

1.2 客户端

public class SocketTcpClient {
    public static void main(String[] args) throws IOException {
        // 创建socket
        final Socket socket = new Socket();
        // 创建socket地址
        SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
        socket.connect(address);
        // 创建PrintWriter
        PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
        BufferedReader socketIn = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));

        // 向服务器发送的内容
        String sendStr = "客户端问服务器端:你是jarye吗?";
        socketOut.write(sendStr);
        socketOut.flush();
        String receiveStr = socketIn.readLine();
        System.out.println("服务器端回复:: " + receiveStr);

        // 关闭连接
        socketOut.close();
        socketIn.close();
        socket.close();
    }
}

2.UDP代码

2.1 服务端代码

/*
* 接收客户端发送的数据
*/

//1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(8800);
//2.创建数据报,用于接收客户端发送的数据
byte[] data = new byte[1024];
//创建字节数组,指定接收的数据包的大小
DatagramPacket packet = new DatagramPacket(data, data.length);
//3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
//此方法在接收到数据报之前会一直阻塞
socket.receive(packet);
//4.读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:" + info);

/*
* 向客户端响应数据
*/

//1.定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "大家好啦~~".getBytes();
//2.创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
//3.响应客户端
socket.send(packet2);
//4.关闭资源
socket.close();

2.2 客户端代码

/*
* 向服务器端发送数据
*/

//1.定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "大家好吗?".getBytes();
//2.创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
//3.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//4.向服务器端发送数据报
socket.send(packet);

/*
* 接收服务器端响应的数据
*/

//1.创建数据报,用于接收服务器端响应的数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
//2.接收服务器响应的数据
socket.receive(packet2);
//3.读取数据
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客户端,服务器说:" + reply);
//4.关闭资源
socket.close();

3.使用Socket模拟Http服务器

public class HttpTest {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        //一直监听,直到受到停止的命令
        while (true) {
            Socket socket = null;
            try {
                //如果没有请求,会一直hold在这里等待,有客户端请求的时候才会继续往下执行
                socket = serverSocket.accept();
                //获取输入流(请求)
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));
                StringBuilder stringBuilder = new StringBuilder();
                String line = null;
                //得到请求的内容,注意这里作两个判断非空和""都要,只判断null会有问题
                while ((line = bufferedReader.readLine()) != null
                        && !line.equals("")) {
                    stringBuilder.append(line).append("<br>");
                }
                String result = stringBuilder.toString();
                System.out.println(result);
                //这里第二个参数表示自动刷新缓存
                PrintWriter printWriter = new PrintWriter(
                        socket.getOutputStream(), true);
                printWriter.println("HTTP/1.1 200 OK");
                printWriter.println("Content-Type:text/html;charset=utf-8");
                printWriter.println();

                printWriter.println("<h5>你刚才发送的请求数据是:<br>");
                //将日志输出到浏览器
                printWriter.write(result);
                printWriter.println("</h5>");
                // release
                printWriter.close();
                bufferedReader.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

     ----------------------------
原文链接:https://www.jianshu.com/p/46193726459b

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2021-08-30 22:01:55 重新编辑]
网站系统异常


系统异常信息
Request URL: http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=3855&replyID=0&skin=1&saveSkin=true&pages=1&replyNum=

java.lang.NullPointerException

如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员