一個簡單的C/S多線程應用,稍微擴充就可以用了
/*socket是網路應用程式的核心,在伺服器端或用戶端網路應用程式中,socket皆為不可缺少的要素
*在伺服器常見的應用有:FTP伺服器,MAIL伺服器(SMTP,POP3,IMAP4協議),WEB(HTTP協議)
*建立伺服器端SOCKET的應用程式步驟如下:
*1。建立伺服器端的SOCKET,並且以此偵聽用戶端的串連請求
*2。當伺服器端偵測到來自用戶端的串連請求時則接收此請求並建立用戶端的SOCKET,該SOCEKT將作為
* 用戶端串連及後續處理髮送及接收資料的依據,至此則完成伺服器端與用戶端的SOCKET通訊連結
*3。處理來自用戶端的資訊,一般稱為請求,可視為用戶端的指令需求。例如HTTP通訊協定的URL請求,
* 或FTP通訊協定的FTP命令(如GET,PUT)等
*4。根據用戶端傳來的請求伺服器端需經過程式邏輯處理之後,發送回相對應的招待結果或錯誤資訊至
* 用戶端如HTTP伺服器鬚髮送回HTML網頁內容,而FTP伺服器則發送回FTP指令的結果
*5。當程式完成資料或命令的處理之後,便關閉SOCKET通訊連結
*/
/*
simpleServer.java
*/
import java.net.*;
import java.io.*;
public class simpleServer
{
private static ServerSocket serverSocket;
private static listenClient listen;
public static void main(String[] args) throws Exception
{
int port;
if(args.length==0)
{
System.out.println("Usage:java simpleServer [port]");
System.exit(1);
}
port=Integer.parseInt(args[0]);
startServer(port);
}
public static void startServer(int port)throws Exception
{
try
{
serverSocket=new ServerSocket(port);
Thread thread=new Thread(new listenClient(serverSocket));
thread.start();
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
class listenClient implements Runnable
{
private ServerSocket serverSocket;
private Socket clientSocket;
DataInputStream in;
DataOutputStream out;
public listenClient(ServerSocket serverSocket)throws Exception
{
this.serverSocket=serverSocket;
}
public void run()
{
try
{
while(true)
{
clientSocket=serverSocket.accept();
System.out.println("Connection from "+clientSocket.getInetAddress().getHostAddress());
in=new DataInputStream(clientSocket.getInputStream());
out=new DataOutputStream(clientSocket.getOutputStream());
String lineSep=System.getProperty("line.separator");//行分隔字元,即斷行符號換行
InetAddress addr=serverSocket.getInetAddress().getLocalHost();
String outData="Server Information: "+lineSep+" Local Host: "+serverSocket.getInetAddress().getLocalHost()+lineSep+" port :"+serverSocket.getLocalPort();
byte[] outByte=outData.getBytes();
out.write(outByte,0,outByte.length);
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
};
/*用戶端SOCKET應用程式與伺服器端SOCKET應用程式的流程很相似,最大的差別在於:
*1。伺服器端SOCKET應用程式主要用於偵聽及接收用戶端的串連,而用戶端的SOCKET
* 應用程式則用於嘗試與伺服器端建立串連
*2。用戶端SOCKET應用程式發送資訊指令至伺服器端,並接收伺服器端所返回的結果;
* 而伺服器端SOCEKT應用程式則處理指示邏輯,並將結果或錯誤資訊發送至用戶端
*
*常見的用戶端應用有:CHAT用戶端,FTP用戶端,POP3用戶端,SMTP用戶端和TELNET用戶端
*建立用戶端SOCKET應用程式的步驟大致如下:
*1。建立用戶端SOCKET,在建立時需指定欲串連伺服器端的主機名稱(或IP)與INTERNET
* 通訊連接埠
*2。發送特定資訊或指令至伺服器端
*3。接收伺服器端返回的執行結果或錯誤資訊,並以特定格式顯示,例如HTTP通訊協定會通過
* HTML顯示
*4。當用戶端不需伺服器端的處理時,便關閉SOCEKT通訊連結
*/
/*
simpleClient.java
*/
import java.net.*;
import java.io.*;
public class simpleClient
{
private static Socket socket;
public static void main(String[] args)throws Exception
{
String host;
int port;
if(args.length <2)
{
System.out.println("Usage:java simpleClient [remote IP/Host] [port]");
System.exit(1);
}
host=args[0];
port=Integer.parseInt(args[1]);
connectServer(host,port);
}
public static void connectServer(String host,int port)
{
try
{
socket=new Socket(InetAddress.getByName(host),port);
DataInputStream in=new DataInputStream(socket.getInputStream());
DataOutputStream out=new DataOutputStream(socket.getOutputStream());
byte[] inByte=new byte[1024];
in.read(inByte);
String response=new String(inByte,0,inByte.length);
System.out.println("Message from server: ");
System.out.println(response.trim());
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch(IOException ex)
{
ex.printStackTrace();
}
finally
{
try
{
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}