上節(jié)回顧:在學(xué)習(xí)了Socket建立客戶端和服務(wù)器雙向交流后,我們發(fā)現(xiàn)它的問答形式不夠靈活做入。
本節(jié)課我們講解如何在服務(wù)器和客戶端之間實(shí)現(xiàn)聊天室~
需要思考的問題:
服務(wù)器端:一個線程專門發(fā)送消息臊泰,一個線程專門接收消息蛉加。
客戶端:一個線程專門發(fā)送消息,一個線程專門接收消息。
除了消化這段代碼外针饥,還需要思考厂抽,怎么實(shí)現(xiàn)一個聊天室!(難度較大6⊙邸?攴铩)
【示例1】聊天室服務(wù)器端
import?java.io.BufferedReader;
import?java.io.BufferedWriter;
import?java.io.IOException;
import?java.io.InputStreamReader;
import?java.io.OutputStreamWriter;
import?java.net.ServerSocket;
import?java.net.Socket;
public?class?ChatServer {
????public?static?void?main(String[] ? args)? {
?????? ServerSocket server=null;
?????? Socket socket=null;
?????? BufferedReader in=null;
???????try?{
?????????? server =?new?ServerSocket(8888);
?????????? socket=server.accept();
???????????new?ServerThread(socket).start();
???????????//main線程負(fù)責(zé)讀取客戶端發(fā)來的信息
?????????? in=new?BufferedReader(new?? InputStreamReader(socket.getInputStream()));
???????????while(true){
????????????? String str=in.readLine();
????????????? System.out.println("客戶端說:"+str);
?????????? }
?????? }?catch?(IOException e) {
?????????? e.printStackTrace();
?????? }finally{
???????????try?{
????????????? in.close();
?????????? }?catch?(IOException e) {
????????????? e.printStackTrace();
?????????? }
???????????try?{
????????????? socket.close();
?????????? }?catch?(IOException e) {
????????????? e.printStackTrace();
?????????? }
?????? }
??? }
}
/**
?*?專門向客戶端發(fā)送消息的線程
?*?@author?Administrator
?*
?*/
class?ServerThread?extends?Thread {
??? Socket ss;
??? BufferedWriter out;
??? BufferedReader br;
????public?ServerThread(Socket ss){
???????this.ss = ss;
???????try?{
?????????? out=new?BufferedWriter(new?? OutputStreamWriter(ss.getOutputStream()));
?????????? br =?new?BufferedReader(new?? InputStreamReader(System.in));??????
?????? }?catch?(IOException e) {
?????????? e.printStackTrace();
?????? }
??? }
????public?void?run(){
???????try?{
???????????while(true){
????????????? String str2 = br.readLine();
????????????? out.write(str2+"\n");
????????????? out.flush(); ?
?????????? }
?????? }?catch?(IOException e) {
?????????? e.printStackTrace();
?????? }finally{
???????????try?{
????????????? out.close();
?????????? }?catch?(IOException e) {
????????????? e.printStackTrace();
?????????? }
???????????try?{
????????????? br.close();
?????????? }?catch?(IOException e) {
????????????? e.printStackTrace();
?????????? }
?????? }
??? }
}
?
【示例2】聊天室客戶端
import?java.io.BufferedReader;
import?java.io.BufferedWriter;
import?java.io.IOException;
import?java.io.InputStreamReader;
import?java.io.OutputStreamWriter;
import?java.net.InetAddress;
import?java.net.Socket;
import?java.net.UnknownHostException;
public?class?ChatClient {
????public?static?void?main(String[] args) {
?????? Socket? socket =?null; ?
?????? BufferedReader in =?null;
???????try?{
?????????? socket=new?Socket(InetAddress.getByName("192.168.1.32"),8888); ?
???????????new?ClientThread(socket).start();
?????????? in=new?BufferedReader(new?? InputStreamReader(socket.getInputStream()));
?????????? //main線程負(fù)責(zé)接收服務(wù)器發(fā)來的信息
???????????while(true){
????????????? ?System.out.println("服務(wù)器說:"+in.readLine()); ?
?????????? }
?????? }?catch?(UnknownHostException e) {
?????????? e.printStackTrace();
?????? }?catch?(IOException e) {
?????????? e.printStackTrace();
?????? }finally{
???????????try?{
????????????? socket.close();
?????????? }?catch?(IOException e) {
????????????? e.printStackTrace();
?????????? }
???????????try?{
????????????? in.close();
?????????? }?catch?(IOException e) {
????????????? e.printStackTrace();
?????????? }
?????? }
??? }
}??
/**
?*?用于向服務(wù)器發(fā)送消息
?*?@author?Administrator
?*
?*/
class?ClientThread?extends?Thread{
??? Socket s;
??? BufferedWriter out;
??? BufferedReader wt;
????public?ClientThread(Socket s){
???????this.s = s;
???????try?{
?????????? out=new?BufferedWriter(new?? OutputStreamWriter(s.getOutputStream()));
?????????? wt=new?BufferedReader(new?? InputStreamReader(System.in));
?????? }?catch?(IOException e) {
?????????? e.printStackTrace();
?????? }
??? }
????public?void?run(){
???????????try?{
??????????????while(true){
????????????????? String str = wt.readLine();
????????????????? out.write(str+"\n" );
????????????????? out.flush();
????????????? }
?????????? }?catch?(IOException e) {
????????????? e.printStackTrace();
?????????? }finally{
??????????????try?{
????????????????? wt.close();
????????????? }?catch?(IOException e) {
????????????????? e.printStackTrace();
????????????? }
?????????? ????try?{
????????????????? out.close();
????????????? }?catch?(IOException e) {
????????????????? e.printStackTrace();
????????????? }
?????????? }
??? }
}
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G苞七,10年Java研發(fā)經(jīng)驗(yàn)藐守,曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作蹂风,從小白逐漸做到工程師卢厂、高級工程師、架構(gòu)師硫眨。精通Java平臺軟件開發(fā)足淆,精通JAVAEE,熟悉各種流行開發(fā)框架礁阁。
?筆記包含從淺入深的六大部分:
?A-Java入門階段
?B-數(shù)據(jù)庫從入門到精通
?C-手刃移動前端和Web前端
?D-J2EE從了解到實(shí)戰(zhàn)
?E-Java高級框架精解
?F-Linux和Hadoop?