1.服務器端啓動ServerSocket
2.客戶端使用Socket
3.客戶端與服務器端使用流通信
4.服務器端啓動多線程,accept函數爲阻塞接收,將接收到的socket對象開闢新的線程處理
程序結構
對應客戶端程序,服務器端程序,線程處理程序
package com.houlu.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientPart {
public static void main(String[] args){
try {
//1.創建客戶端Socket,指定服務器地址和端口號
Socket socket = new Socket("localhost", 8888);
//2.獲取輸出流
OutputStream os = socket.getOutputStream();//字節輸出流
OutputStreamWriter osw = new OutputStreamWriter(os); //字符流
BufferedWriter bw = new BufferedWriter(osw);
bw.write("用戶名:admin;密碼:123");
bw.flush();
socket.shutdownOutput();
//3.獲取輸入流,讀取服務器端響應
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String receiveStr = null;
while((receiveStr=br.readLine())!=null ){
System.out.println("我是客戶端,服務器說:"+receiveStr);
}
//4.關閉輸出流,打開的資源
// socket.shutdownInput();
socket.close();
br.close();
isr.close();
is.close();
bw.close();
osw.close();
os.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.houlu.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerPart {
public static void main(String[] args){
try {
//1.創建一個服務器端的SOCKET,綁定相應端口,監聽此端口
ServerSocket serverSocket = new ServerSocket(8888);
//2.調用accept()方法開始監聽,等待客戶端連接
Socket socket = null;
System.out.println("***服務器即將啓動,等待客戶端連接***");
//3.統計連接客戶端數量
int count=0;
while(true){
socket = serverSocket.accept();
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
count++;
System.out.println("客戶端數量爲"+count);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.houlu.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
public class ServerThread extends Thread{
private Socket socket;
public ServerThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
InputStream is=null;
InputStreamReader isr =null;
BufferedReader br = null;
String receiveStr = null;
OutputStream os = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
InetAddress address = socket.getInetAddress();
System.out.println("當前客戶端連接地址"+address.getHostAddress());
//1.獲取輸入流,讀取客戶端信息
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
System.out.println("服務器開始接收");
while((receiveStr=br.readLine())!=null ){
System.out.println("我是服務器,客戶說:"+receiveStr);
}
System.out.println("服務器接受結束");
// socket.shutdownInput();//關閉輸入流
//2.獲取輸出流,響應客戶端請求
os = socket.getOutputStream();
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
bw.write("歡迎您連接");
bw.flush();
// socket.shutdownOutput();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
if(bw!=null)
bw.close();
if(osw!=null)
osw.close();
if(os!=null)
os.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
if(is!=null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}