實現基於TCP/IP協議的簡單Client/Server程式
阿新 • • 發佈:2018-12-27
所謂簡單是指的是:
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());
}
}
}