一、基本原理
Socket通信
Socket通信模型
ServerSocket的構(gòu)造方法
服務(wù)器端創(chuàng)建的步驟
客戶端創(chuàng)建的步驟
二、實(shí)際運(yùn)行
服務(wù)器代碼:
public static void main(String[] args) {
try {
//1公你、創(chuàng)建ServerSocket,綁定端口
ServerSocket serverSocket=new ServerSocket(8888);
System.out.println("服務(wù)器已經(jīng)啟動(dòng)假瞬,等待連接陕靠。。脱茉。剪芥。");
//2、等待客戶機(jī)的連接
Socket socket=serverSocket.accept();
//3琴许、創(chuàng)建輸入流税肪,接收客戶端傳來的消息
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
String inString=null;
while((inString=bufferedReader.readLine())!=null){//循環(huán)讀取
System.out.println("客戶端說:"+inString);
}
socket.shutdownInput();
//4、創(chuàng)建輸出流榜田,給客戶端返回響應(yīng)的消息
OutputStream outputStream=socket.getOutputStream();
PrintWriter printWriter=new PrintWriter(outputStream);
printWriter.write("歡迎您益兄!");
printWriter.flush();
socket.shutdownOutput();
//5、依次關(guān)閉
printWriter.close();
outputStream.close();
bufferedReader.close();
inputStream.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
客戶端代碼:
public static void main(String[] args) {
try {
//1箭券、創(chuàng)建客戶端Socket,并且綁定IP地址和端口號(hào)
Socket socket=new Socket("localhost",8888);
//2净捅、創(chuàng)建輸出流,向服務(wù)器發(fā)送消息
OutputStream outputStream=socket.getOutputStream();//字節(jié)輸出流
PrintWriter printWriter=new PrintWriter(outputStream);//變成打印流
printWriter.write("用戶名:Simon_Deng,密碼:123456");
System.out.println("已經(jīng)信息發(fā)送給服務(wù)器辩块!");
printWriter.flush(); //很重要蛔六,一定要寫,否則消息發(fā)布出去
socket.shutdownOutput(); //關(guān)閉輸出流
//3庆捺、接收服務(wù)器返回的消息
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
String infoString=null;
while((infoString=bufferedReader.readLine())!=null){//循環(huán)讀取
System.out.println("接收到服務(wù)器信息:"+infoString);
}
//4古今、依次關(guān)閉
socket.shutdownInput();
bufferedReader.close();
inputStream.close();
printWriter.close();
outputStream.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
服務(wù)器運(yùn)行截圖
客戶端截圖
三、多線程通話
要實(shí)現(xiàn)多線程滔以,只需改服務(wù)器即可,客戶端代碼不變
要新建ServerThread類繼承Thread類
ServerThread代碼:
public class ServerThread extends Thread{
Socket socket=null;
InputStream inputStream=null;
OutputStream outputStream=null;
BufferedReader bufferedReader=null;
String info=null;
PrintWriter printWriter=null;
public ServerThread(Socket socket){
this.socket=socket;
}
public void run(){
try {
inputStream=socket.getInputStream();
bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
while((info=bufferedReader.readLine())!=null){
System.out.println("我是服務(wù)器氓拼,客戶端說:"+info);
}
outputStream=socket.getOutputStream();
printWriter=new PrintWriter(outputStream);
printWriter.write("歡迎你你画!");
printWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(printWriter!=null)
printWriter.close();
if(outputStream!=null)
outputStream.close();
if(bufferedReader!=null)
bufferedReader.close();
if(inputStream!=null)
inputStream.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服務(wù)器代碼:
public static void main(String[] args) {
try {
int count=0;
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket=null;
System.out.println("服務(wù)器正在等待連接.....");
while(true){
socket=serverSocket.accept();
ServerThread serverThread=new ServerThread(socket);
serverThread.start();
count++;
System.out.println("客戶機(jī)編號(hào):"+count+"已經(jīng)連接抵碟!");
InetAddress address=socket.getInetAddress();
System.out.println("當(dāng)前客戶端ip地址為"+address.getHostAddress());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
服務(wù)器運(yùn)行截圖