在java中通過socket進行交互的過程中主要用到Socket和ServerSocket兩個類,ServerSocket可以監聽指定的服務器端口而Socket則用於和連接的對方進行對話。基本的socket有客戶端和服務器端兩個部分。由服務器端通過ServerSocket類不斷監聽本地端口,當接收到客戶端的連接請求後將Socket的輸入、輸出重定義到Network Stream流,這樣我們就可以利用BufferedReader類和PrintWriter類實現以out.println()或in.readLine()等形式從socket中獲取或發送數據。最簡單的socket程序如下
import java.io.*;
import java.net.*;
public final class Client {
//客戶端
public Client() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
/*if(args.length !=1)
{
System.out.println("格式:java client servername");
return;
}
String SvrName =args[0];*/
Socket connection;
//向指定ip和端口發送連接請求
connection = new Socket("192.168.23.46",1414);
//將socket進行重定向,方便以out.println和in.readLine的形式獲取和發送數據
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
PrintWriter out=new PrintWriter(connection.getOutputStream(),true);
String info;
//讀取服務器端傳來的數據並顯示
info = in.readLine();
System.out.println(info);
connection.close();
}
catch(Exception e)
{
System.out.println("訪問異常!");
}
}
}
import java.net.*;
import java.io.*;
public class Server {
//服務器端
/**
* @param args
*/
ServerSocket server;
Socket socket;
public static void main(String[] args) {
// TODO Auto-generated method stub
Server TempServer=new Server();
}
public Server()
{
try
{
//監聽1414端口
server=new ServerSocket(1414);
System.out.println("Socket監聽服務已啓動。");
System.out.println("等待客戶端請求。");
//等待客戶端連接
socket = server.accept();
System.out.println("連接成功。");
//將socket進行重定向,方便以out.println和in.readLine的形式獲取和發送數據
BufferedReader in =new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
//發送數據
out.println("來自監聽服務器的問候:您好!");
out.close();
in.close();
server.close();
}
catch(Exception e)
{
System.out.println(e.toString());
System.exit(1);
}
}
}
以上只是最基本的運用socket進行的通信程序,但是僅能實現服務器和單個客戶端通信。要實現服務器和多個客戶端通信還需要運用到多線程。java中實現多線程的一種方式是繼承Thread類(由於每個子類只能有一個父類,因此在特定環境下該方法並不適用,此時是通過Runnable接口進行實現,這裏不多討論)。實現方式如下
import java.lang.*;
class MyThread extends Thread
{
long Temp;
myThread(long Temp)
{
this.Temp=Temp;
}
public void(run)
{
//獨立線程的相關操作
}
}
當使用該線程是隻需執行如下語句:
myThread p=new myThread(0);
p.start();
實現服務器和多個客戶端通信的的思想是主程序中通過死循環對端口進行持續監聽,每一個用戶通過子線程進行通信。同時還可以運用回調函數在字線程中將用戶id之類的信息反饋給主程序。