Java学习-Tcp_Socket通信原理

如何开发一个Server-Client模型的程序

  • 服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

  • 客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

服务器端

package com.anqi.tcp;

import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
            //1.创建服务器 指定端口        
            //ServerSocket(int port) 创建绑定到特定端口的服务器套接字
            ServerSocket server = new ServerSocket(8888);
            //2.接收客户端连接 阻塞式
            Socket socket = server.accept();
            System.out.println("与一个客户端建立连接");
            //3.发送数据
            String msg = "这是服务器发送的数据";
            //4.输出流
            /*
            BufferedWriter bw = new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream()));
            bw.write(msg);
            bw.newLine();
            bw.flush();*/
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            dos.writeUTF(msg);
            dos.flush();
            //void writeUTF(String str) 
            //以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。 


            //不用关闭连接,因为一般服务器都是不间断运行
    }
}

客户端

package com.anqi.tcp;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {
        //先运行客户端会报错,因为没有与之建立连接的服务器
    public static void main(String[] args) throws IOException {
        //1.创建客户端 
        //此类实现客户端套接字(也可以就叫“套接字”)。
        //套接字是两台机器间通信的端点
        //Socket(String host, int port) 
        // 创建一个流套接字并将其连接到指定主机上的指定端口号
        Socket socket = new Socket("localhost",8888);
        //2.接收数据
        /*
        BufferedReader br = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        String str = br.readLine(); //阻塞式方法,如果没有newline会报异常
        System.out.println(str);
        */
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String msg = dis.readUTF();
        System.out.println(msg);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值