1. 程式人生 > >實現基於TCP/IP協議的簡單Client/Server程式

實現基於TCP/IP協議的簡單Client/Server程式

所謂簡單是指的是:
1、伺服器一次只能響應一個客戶端的請求,直到和客戶端斷開連結才可以響應下一個客戶端請求。不能多客戶端連結伺服器

客戶端:

我們是在本機上做的測試,所以客戶端所連結的host地址是用的127.0.0.1這個迴環地址。埠好使用1023以上的,1023以下的埠號被系統保留。

package socket.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import
java.net.Socket; import java.net.UnknownHostException; import java.util.Calendar; public class socketclientDemo { public socketclientDemo(){ } public static void main(String[] args){ /* *這一部分是用於獲取命令列引數用的,如果為輸入引數,那麼自動列印本機主機名/ip地址 */ if(args.length>0) { } else
{ try { InetAddress localHostAddress=InetAddress.getLocalHost(); System.out.println(localHostAddress.toString()); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try
{ //客戶端開啟一個socket Socket socket=new Socket("127.0.1.1", 2016); socket.setSoTimeout(6000); //開啟socket對應的輸出和輸入流 PrintWriter pw =new PrintWriter(socket.getOutputStream(),true); BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); //給伺服器傳送資訊,可以看到和JAVA IO基本是一樣的 pw.println(br.readLine()+Calendar.getInstance().getTime().toString()); //pw.println(Calendar.getInstance().getTime().toString()); pw.flush(); /** * 獲取伺服器發過來的資訊 */ BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(socket.getInputStream())); String result=bufferedReader.readLine(); System.out.println("Server say"+result); pw.close(); bufferedReader.close(); socket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

伺服器端程式

package server.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;

public class ServerSocketDemo {

    public ServerSocketDemo() {
    // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
    //伺服器開啟一個serversocket監聽2016埠,
        ServerSocket serverSocket = new ServerSocket(2016);
        while (true) {
        //accept函式會一直阻塞這裡,直到監聽到客戶端請求然後返回一個socket,用於雙方之間的通訊。建立連線後雙方都是用socket進行通訊,是平等的關係。
        Socket socket = serverSocket.accept();
        /**
         * 獲取客戶端傳送過來的資訊,先獲取輸入流,
         */
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String resultString = bufferedReader.readLine();
        System.out.println("Client say\t" + resultString);
        /**
         * 伺服器傳送資訊給客戶端,先獲取輸出流
         */
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.println("hello , i'm  server" + Calendar.getInstance().getTime().toString());
        printWriter.flush();

        printWriter.close();
        bufferedReader.close();
        socket.close();

        }
    } catch (Exception e) {
        // TODO: handle exception
        System.out.println("Exception" + e.getMessage());
    }

    }

}