网络Socket入门编程

连接、传送与接收

要让客户端能够工作,有三件事必须学:

  • 如何建立客户端与服务器之间的初始连接
  • 如何传送消息到服务器
  • 如何接收来自服务器的消息
Created with Raphaël 2.1.0 客服端Client 客服端Client 服务器Server 服务器Server 1.连接服务器 连接127.0.0.1的5000这个端口号 2.传送消息 writes.println(message) 3.服务器接收消息 String s=reader.readerLine()

一.建立连接

要连接到其他的机器上,我们会需要Socket的连接. Socket是个代表两台机器之间网络连接的对象(java.net .Socket ) 。什么是连接?两台机器之间的一种关系。让两个软件相互认识对对方。最重要的是同者知道如何与对方通信,也就是说知道如何发送数据给对方。
网络Socket入门编程_第1张图片
TCP端口只是一个16位宽、用来识别服务器上特定程序的数字。IP地址就好像是门口的号牌,IP地址可以指特定的地方,端口号则是该地址不同的窗口,比如25号窗口处理邮件,80端口处理网页

二.使用BufferedReader从Socket读取数据

1.建立对服务器的Socket连接
Socket so = new Socket(“服务器ip地址”,”端口号”);
2.建立连接到Socket上低层次输入串流的InputStreamReader InputStreamReader stream = new InputStreamReader(so.getInputStream());//从Socket中取得输入串流
3.建立BufferedReader来读取
BufferedReader reader = new BufferedReader(stream);
String message = reader.readLine();
网络Socket入门编程_第2张图片
三.用PrintWriter写数据到Socket上

1.对服务器建立Socket连接
Socket so = new Socket(“服务器ip地址”,”端口号”);
2.建立链接到Socket的PrintWriter
PrintWriter writer = new PrintWriter(so.getOutputStream());
3.写入数据
writer.println(“message1”);
writer.print(“message2”);
网络Socket入门编程_第3张图片

四.编写简单的客户端程序

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

public class AdviceClient {
    public void go() {
        try {
            Socket so = new Socket("127.0.0.1", 4242);
            InputStreamReader stream = new InputStreamReader(
                    so.getInputStream());
            BufferedReader reader = new BufferedReader(stream);// 链接数据串流
            String advice = reader.readLine();
            System.out.println("今天你应该:" + advice);
            reader.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        AdviceClient client = new AdviceClient();
        client.go();
    }
}

这是一个读取本机端口号为4242的客户端程序

五.编写简单的服务器程序

服务器工作方式:
1. 服务器应用程序对特定端口创建出ServerSocket。
ServerSocket ss = new ServerSocket(4242);
这会让服务器应用程序开始监听来自4242端口的客户端请求。
2. 客户端对服务器应用程序建立Socket连接。
Socket so = new Socket(“127.0.0.1”,4242);
客户端得知道IP地址与端口号
3. 服务器创建出与客户端通信的新Socket.
Socket so=ss.accept();
accept()方法会在等待用户的Socket连接时闲置着。当用户连上来时,此方法会返回一个Socket以便与客户端通信。Socket与ServerSocket的端口不相同,因此ServerSocket可以空出来等待其他的用户。

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class AdviceServer {

    String[] adviceList = { "好好学习,天天向上", "天道酬勤", "失败是成功之母", "珍惜现在,赢得未来" };

    public void go() {
        try {
            // ServerSocket会监听客户端对这台机器在4242端口上的要求
            ServerSocket ss = new ServerSocket(4242);
            // 服务器进入无穷循环等待客户端的请求
            while (true) {
                // 客服端请求到达
                Socket so = ss.accept();
                PrintWriter writer = new PrintWriter(so.getOutputStream());
                String advice = getAdvice();
                writer.println(advice);
                writer.close();
                System.out.println(advice);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private String getAdvice() {
        int random = (int) (Math.random() * adviceList.length);
        return adviceList[random];
    }

    public static void main(String[] args) {
        AdviceServer server = new AdviceServer();
        server.go();
    }

}

聪明的读者不难发现,以上的简单服务器应用程序是不能够处理多个用户请求。这不是很难,使用不同的线程并让新的客户端取得新的线程就好。

你可能感兴趣的:(学习笔记,socket,网络,服务器)