简单Socket编程

socket是神马就不介绍, 自行Google,

socket编程的一般步骤为:

服务器端:
  1. 打开服务器, 3000是端口
    ServerSocket serverSocket = new ServerSocket(3000);
  2. 监听是否有客户端的链接, 得到客户的socket,
    Socket socket = serverSocket.accept();
  3. 得到socket的输入流和输出流(大概就这个意思吧, 不知道怎么个叫法, 如果不懂, 就去学下IO先,吐舌头其实自己也不是很懂), 注意PrintWriter的构造方法, 第二个参数为true, 表示调用println, printf, format方法后自动刷新,而不是正好输出换行符才刷新, 如果不添加这个参数, 则在后面输出信息时必须手动刷新, (后面再看)
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
  4. 然后就是读取客户端的数据, 发送数据到客户端了,
服务器干完了自己的事, 接下来就是等着客户端来连接了
客户端:
  1. 连接到服务器(这个不要解释吧)
    Socket socket = new Socket("localhost", 3000);
  2. 同服务器端第3步, 得到socket的输入流和输出流(懒得复制粘贴了, 同上)
  3. 跟服务器通信总有有点什么东西通信吧, 从控制台写几个字到服务器端, 首先得到控制台输入流
    BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
  4. 发送数据到服务器, 接收从服务器上返回的信息

全部代码如下:
ServerSocketTest.java
package net.step1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketTest {

    public static void main(String args[]) throws IOException {
        ServerSocket serverSocket = new ServerSocket(3000);
        System.out.println("服务器启动");
        Socket socket = null;
        while (true) {
            try {
                socket = serverSocket.accept();
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
                InetAddress addr = socket.getInetAddress();
                System.out.println("Client's Ip Address: " + addr);
                System.out.println("Client's port: " + socket.getPort());

                String msg;
                // 读取客户端的信息
                while ((msg = br.readLine()) != null) {
                    System.out.println("client say: " + msg);
                    
                    // 这里按照我的理解是这里的信息有点类似于马桶里的..., 如果不自刷新的话, 
                    // 你每次都调用flush() 函数才能冲走, 现在变智能了, 你使用println() 自动就发送出去了(冲走了).
                    pw.println("server echo: " + msg);
                    //pw.flush();
                    
                    // 如果客户端说 "bye" 就拜了, 就结束这次通话了
                    if (msg.equals("bye")) {
                        break;
                    }
                }
            } catch (IOException e) {
            } finally {
                socket.close();
            }
        }
    }
}

SocketTest.java
package net.step1;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class SocketTest {
    public static void main(String args[]) throws Exception{
        Socket socket = new Socket("localhost", 3000);
        System.out.println("Connecting to the Server");
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
        
        String msg;
        // 读取控制台的输入
        while ((msg = sysin.readLine()) != null){
            pw.println(msg);
            System.out.println(br.readLine());
            // 跟服务器说 bye
            if (msg.equals("bye")){
                break;
            }
        }
    }
}

好了, 下一篇是多线程的Socket。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值