客户端和服务端的代码如下所示。写完代码,先运行服务端的代码,然后等待客户端连接,再运行客户端的代码,即可。
客户端代码如下:
- import java.io.*;
- import java.net.*;
- public class DailyAdviceClient {
- public void go(){
- try {
- Socket s=new Socket("127.0.0.1",4242);//建立对服务器的Socket连接
- //客户端从服务器读取数据
- //建立连接到socket上低层输入串流的InputStreamReader
- //InputStreamReader是低层和高层串流间的桥梁
- //s.getInputStream()从Socket取得输入串流
- InputStreamReader streamReader=new InputStreamReader(s.getInputStream());
- //建立BufferedReader来读取
- BufferedReader reader=new BufferedReader(streamReader);
- String adviceString=reader.readLine();
- System.out.println("Today you should: "+adviceString);
- //客户端向服务器发送数据
- //创建不带自动行刷新的PrintWriter对象,
- //如果添加第二个参数true,则为自动刷新,不需要写writer.flush()这行代码
- PrintWriter writer=new PrintWriter(s.getOutputStream());
- writer.println("Hello,I am Client2!");
- writer.flush();//刷新发送数据
- System.out.println("此套接字连接的远程地址:"+s.getInetAddress().getHostAddress());
- System.out.println("此套接字绑定的本地地址:"+s.getLocalAddress().getHostAddress());
- System.out.println("此套接字绑定的本地端口:"+s.getLocalPort());
- System.out.println("此套接字连接到的远程端口:"+s.getPort());
- s.close();//关闭socket
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static void main(String[]args){
- DailyAdviceClient client=new DailyAdviceClient();
- client.go();
- }
- }
- import java.io.*;
- import java.net.*;
- public class DailyAdviceServer {
- String[] adviceList={"Take smaller bites","One word: inappropriate",""
- + "Just for today,be honest","Tell your boss"};
- public void go(){
- try {
- //服务器应用程序对特定端口创建出ServerSocket对象
- //这会让服务器应用程序监听来自4242端口的客户端请求
- ServerSocket serverSocket=new ServerSocket(4242);
- //服务器进入无穷循环等待客户端的请求
- while(true){
- System.out.println("等待客户端连接...");
- //接收到用户连接请求后,此方法会返回一个socket,以便于客户端通信
- //此socket的端口号和serverSocket的端口号不同
- Socket sock=serverSocket.accept();//此方法会阻塞直到有连接请求到达
- System.out.println("此套接字连接的地址:"+sock.getInetAddress().getHostAddress());
- System.out.println("此套接字绑定的本地地址:"+sock.getLocalAddress().getHostAddress());
- System.out.println("此套接字绑定的本地端口:"+sock.getLocalAddress());
- System.out.println("此套接字连接到的远程端口:"+sock.getPort());
- //服务器向客户端发送数据
- PrintWriter writer=new PrintWriter(sock.getOutputStream());
- String adviceString=getAdvice();
- writer.println(adviceString);
- writer.flush();
- System.out.println(adviceString);
- //服务器接收客户端发送的数据
- InputStreamReader streamReader=new InputStreamReader(sock.getInputStream());
- BufferedReader reader=new BufferedReader(streamReader);
- String adviceStringREC=reader.readLine();
- System.out.println("REC: "+adviceStringREC);
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public String getAdvice(){
- int random=(int)(Math.random()*adviceList.length);
- return adviceList[random];
- }
- public static void main(String []args){
- DailyAdviceServer server=new DailyAdviceServer();
- server.go();
- }
- }