Java很詳細的個人解析版本:網(wǎng)絡(luò)編程,使用多線程實現(xiàn)1對1聊天,聊天室【詩書畫唱】
我和我文字的故事:開始寫作的契機是我想記錄我認為重要的一切!是為了不枉活過人生這一遭!是為了證明我曾存在過!
寫作過程中印象最深的一件事之一:我突然感覺自己目前的渺小,目前厲害的人太多了!但我要借目前雖渺小,但有的獨有優(yōu)勢變得比他們更厲害!而且要謙虛卻不自卑,卻不妄自菲薄,卻不懦弱,卻不膽小,卻不無動于衷等。自信膽大,卻不自傲,卻不自大等。
使用多線程實現(xiàn)1對1聊天

package dengLu;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class oneVoneFu {
public static void main(String[] args) throws Exception{
System.out.println("詩書畫唱SSHC,服務(wù)器端啟動,"
+ "\n請先輸入內(nèi)容,將會發(fā)給客戶端");
jieShouClass jieShouClass=new jieShouClass(33397);
// jieShouClass(int wofangduankou) ,
// 33397是接收客戶端發(fā)送給服務(wù)端時,服務(wù)端要用來接受
// 客戶端發(fā)來內(nèi)容的端口號,33397為服務(wù)端專門用來接受
// 客戶端發(fā)來內(nèi)容的端口號
faSongClass faSongClass=
new faSongClass(44497,11197,"localhost");
//44497為當前服務(wù)器發(fā)送給客戶端內(nèi)容時要用的本機端口號,
//11197為客戶本機端口號
new Thread(jieShouClass,"詩書畫唱").start();
new Thread(faSongClass).start();
}
}


package dengLu;
import java.util.*;
import java.io.*;
import java.net.*;
public class oneVoneKe {
public static void main(String[] args)throws Exception {
System.out.println("詩書畫唱,客戶端啟動");
jieShouClass jieShouClass=new jieShouClass(11197);
faSongClass faSongClass
=new faSongClass(22297,33397,"localhost");
// 這里的22297為端口號
new Thread(jieShouClass,"詩書畫唱SSHC").start();
new Thread(faSongClass).start();
}
}
//————
//將發(fā)送數(shù)據(jù)封為一個類,
//將接收數(shù)據(jù)封為一個類,
//在用戶不管是客戶端還是服務(wù)器端都開啟一個接收和發(fā)送的線程。
//————
class jieShouClass implements Runnable{
DatagramSocket DatagramSocket=null;
public jieShouClass(int benJiDuanKouHao){
try {
DatagramSocket=new DatagramSocket(benJiDuanKouHao);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
//接收數(shù)據(jù)也是死循環(huán)
while(true){
// byteArrayRead:用來讀對方輸入的內(nèi)容的字節(jié)數(shù)組
byte[] byteArrayRead=new byte[1024*60];
DatagramPacket DatagramPacket=
new DatagramPacket
(byteArrayRead, byteArrayRead.length);
try {
DatagramSocket.receive(DatagramPacket);
//解析數(shù)據(jù):
// byteArrayPrint:用來打印出讀出的對方發(fā)送過來的
// 內(nèi)容的字節(jié)數(shù)組
byte[] byteArrayPrint=DatagramPacket.getData();
int lenPrint=DatagramPacket.getLength();
// jieShouDaoDeNeiRong:接收到對方發(fā)來的內(nèi)容
String jieShouDaoDeNeiRong
=new String(byteArrayPrint,0,lenPrint);
if(jieShouDaoDeNeiRong.trim().equals("不聊了")){
break;
}
System.out.println(Thread.currentThread().getName()
+":"+jieShouDaoDeNeiRong);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//:接收數(shù)據(jù)
}DatagramSocket.close();
}
}
class faSongClass implements Runnable{
private int wofangduankou,duiFangDuanKouHao;
String duiFangIP=null;
Scanner s=new Scanner(System.in);
//發(fā)送的對象:
// benJiDuanKouHao:本機端口號
// duiFangDuanKouHao:對方端口號
// duiFangIP:對方IP
DatagramSocket DatagramSocket=null;
public faSongClass(int benJiDuanKouHao,
int duiFangDuanKouHao,String duiFangIP){
this.duiFangDuanKouHao=duiFangDuanKouHao;
this.duiFangIP=duiFangIP;
try {
DatagramSocket=new?
DatagramSocket(benJiDuanKouHao);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while(true){
//打包數(shù)據(jù):
// shuRuNeiRong;輸入內(nèi)容
System.out.println(
// Thread.currentThread().getName()+
"——————\n"
+ "下面是評論區(qū)(請輸入你的內(nèi)容)\n"
+ "——————");
//System.out.println(
// Thread.currentThread().getName()+":");
String shuRuNeiRong=s.next();
DatagramPacket DatagramPacket
=new DatagramPacket(shuRuNeiRong.getBytes(),
shuRuNeiRong.getBytes().length,
new InetSocketAddress(duiFangIP,duiFangDuanKouHao));
if(shuRuNeiRong.trim().equals("不聊了")){
break;
}
try {
DatagramSocket.send(DatagramPacket);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
DatagramSocket.close();
}
}





