Java很详细的个人解析版本:网络编程,使用多线程实现1对1聊天,聊天室【诗书画唱】
我和我文字的故事:开始写作的契机是我想记录我认为重要的一切!是为了不枉活过人生这一遭!是为了证明我曾存在过!
写作过程中印象最深的一件事之一:我突然感觉自己目前的渺小,目前厉害的人太多了!但我要借目前虽渺小,但有的独有优势变得比他们更厉害!而且要谦虚却不自卑,却不妄自菲薄,却不懦弱,却不胆小,却不无动于衷等。自信胆大,却不自傲,却不自大等。
使用多线程实现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,服务器端启动,"
+ "\n请先输入内容,将会发给客户端");
jieShouClass jieShouClass=new jieShouClass(33397);
// jieShouClass(int wofangduankou) ,
// 33397是接收客户端发送给服务端时,服务端要用来接受
// 客户端发来内容的端口号,33397为服务端专门用来接受
// 客户端发来内容的端口号
faSongClass faSongClass=
new faSongClass(44497,11197,"localhost");
//44497为当前服务器发送给客户端内容时要用的本机端口号,
//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();
}
}
//————
//将发送数据封为一个类,
//将接收数据封为一个类,
//在用户不管是客户端还是服务器端都开启一个接收和发送的线程。
//————
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() {
//接收数据也是死循环
while(true){
// byteArrayRead:用来读对方输入的内容的字节数组
byte[] byteArrayRead=new byte[1024*60];
DatagramPacket DatagramPacket=
new DatagramPacket
(byteArrayRead, byteArrayRead.length);
try {
DatagramSocket.receive(DatagramPacket);
//解析数据:
// byteArrayPrint:用来打印出读出的对方发送过来的
// 内容的字节数组
byte[] byteArrayPrint=DatagramPacket.getData();
int lenPrint=DatagramPacket.getLength();
// jieShouDaoDeNeiRong:接收到对方发来的内容
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();
}//:接收数据
}DatagramSocket.close();
}
}
class faSongClass implements Runnable{
private int wofangduankou,duiFangDuanKouHao;
String duiFangIP=null;
Scanner s=new Scanner(System.in);
//发送的对象:
// 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){
//打包数据:
// shuRuNeiRong;输入内容
System.out.println(
// Thread.currentThread().getName()+
"——————\n"
+ "下面是评论区(请输入你的内容)\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();
}
}





