Java项⽬聊天室swing版
引⼦:
当前,互联⽹ 体系结构的参考模型主要有两种,⼀种是OSI参考模型,另⼀种是TCP/IP参考模型。
⼀、OSI参考模型,即开放式通信系统互联参考模型(OSI/RM,Open Systems Interconnection Reference Model),是国际标准化组织(ISO)提出的⼀个试图使各种计算机在世界范围内互连为⽹络的标准框架,简称OSI。
OSI参考模型将实现⽹络互连的通信协议分为7层,⾃上⽽下分别是:
第7层应⽤层:OSI中的最⾼层,为⽤户提供各项互联⽹应⽤,如公司⽼板通过浏览器上⽹、发送电⼦邮件等。 常见的协议
有:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。
第6层表⽰层:相当公司中替⽼板写信的助理。
第5层会话层:相当于公司中收寄信、写信封与拆信封的秘书。
第4层传输层:提供终端到终端的可靠连接,相当于公司中跑邮局的送信职员。
第3层⽹络层: 确保信件通过⼀系列路由到达⽬的地。
第2层数据链路层: 决定访问⽹络介质的⽅式,并处理流控制。
第1层物理层:处于OSI参考模型的最底层,物理层的主要功能是利⽤物理传输介质为数据链路层提供物理连接,以便透明地传输⽐特流;该层的常⽤设备有⽹卡、集线器、中继器、调制解调器、⽹线、双绞线、同轴电缆等各种物理设备。
数据发送时,从第七层传到第⼀层,接收数据则相反。
上三层总称为“应⽤层”,⽤来控制软件⽅⾯;下四层总称为“数据流层”,⽤来管理硬件。除了物理层之外,其他层都是⽤软件实现的。
⼆、TCP/IP参考模型。
第四层应⽤层:协议有DNS、FTP、HTTP、HTTPS、Telnet、SMTP等;
第三层传输层:TCP、UDP等;
第⼆层⽹际层: IP、ICMP等;
第⼀层⽹络接⼝层:ARP、RARP等。
我们在对上述两种参考模型有些了解后,接下来主要看TCP和UDP。我们先来看⼆者的区别:
1.TCP⾯向连接(如打电话要先拨号建⽴连接);UDP是⽆连接的,即发送数据之前不需要建⽴连接;
2.TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,⽆差错,不丢失,不重复,且按序到达;UDP尽最⼤努⼒交付,即不保证可靠交付;
3.TCP⾯向字节流,实际上是TCP把数据看成是⼀连串⽆结构的字节流;UDP是⾯向报⽂的,它没有拥塞控制,因此⽹络出现拥塞不会使源主机的发送速率降低(如IP电话,实时视频会议等)
4.每⼀条TCP连接只能是点到点的;UDP⽀持⼀对⼀,⼀对多,多对⼀和多对多的交互通信;
5.TCP⾸部开销20字节;UDP的⾸部开销⼩,只有8个字节;
6.TCP的逻辑通信信道是全双⼯的可靠信道,UDP则是不可靠信道。
在Java中,对遵守TCP协议的类有ServerSocket和Socket,遵守UDP协议的类有DatagramSocket。
我这⾥提供的聊天室项⽬,是基于TCP协议的。
该项⽬分为4个包,分别是utils(提供⼯具),ui(提供窗体界⾯),server(服务器⼦线程),client(客户端⼦线程)。项⽬⽂件包结构如下图所⽰:
项⽬运⾏后的效果如下图所⽰:
接下来是项⽬代码:
package 聊天室swing版.utils;
/**
* ⼯具类,服务器ip,端⼝等信息
*/
import java.InetAddress;
import java.UnknownHostException;
public abstract class HostInfo {
public static String IP=getIP();
public static final int PORT=10086;
public static final int NUM=50;
public static final String NEW_LINE="\r\n";
private static String getIP(){
try {
LocalHost().getHostAddress(); } catch (UnknownHostException e) {
e.printStackTrace();
return null;
}
}
}
-----------------------------------------------------------package 聊天室swing版.utils;
/**
* ⼯具类,释放资源
*/
import java.io.BufferedReader;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.ServerSocket;
import java.Socket;
public abstract class Release {
public static void release(Socket socket,BufferedWriter bw){
release(null,socket,null,bw);
}
public static void release(Socket socket,BufferedReader br){
release(null,socket,br,null);
}
public static void release(Socket socket){
release(null,socket,null,null);
}
public static void release(ServerSocket server){
release(server,null,null,null);
}
public static void release(ServerSocket server,Socket socket,BufferedReader br,BufferedWriter bw){ if(server!=null){
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bw!=null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
-----------------------------------------------------------------
package 聊天室swing版.server;
/**
* 服务器Server类
*/
import java.io.IOException;
import java.ServerSocket;
import java.Socket;
import java.util.ArrayList;
import java.util.List;
import 聊天室swing版.ui.UIserver;
import 聊天室swing版.utils.HostInfo;
import 聊天室swing版.utils.Release;
public class Server extends Thread {
private ServerSocket server;
private ServerSocket server;
public static List<Transport> clients=new ArrayList<>();
@Override
public void run() {
try {
server=new ServerSocket(Integer.parseInt(UIserver.Text().trim()));
} catch (IOException e) {
throw new RuntimeException("服务器端⼝被占!");
}
UIserver.bt_open.setText("已启动服务器");
UIserver.bt_open.setEnabled(false);
UIserver.jta_log.append("服务器成功启动!"+HostInfo.NEW_LINE);
new Accept().start();
}
class Accept extends Thread{
private Socket socket;
@Override
public void run() {
int num=0;
while(num<HostInfo.NUM){
try {
socket=server.accept();
} catch (IOException e) {
throw new RuntimeException("客户端连接失败!");
}
num++;
String str="第 "+num+" 个客户端连接成功!==>"+InetAddress().getHostAddress()+" :"+Port()+HostInfo.NEW_LINE; UIserver.jta_log.append(str);
clients.add(new Transport(socket));
}
UIserver.jta_log.append("超出服务器负荷!");
}
}
}
----------------------------------------------------
package 聊天室swing版.server;
/**
* 处理服务器Server类中接收客户端发来的信息,以及转发客户端发来的信息
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.Socket;
import 聊天室swing版.utils.Release;
public class Transport extends Thread {
private Socket socket;
private String ip;
public Transport(Socket socket){
this.socket=socket;
this.InetAddress().getHostAddress();
this.start();
}
@Override
public void run() {
BufferedReader br=null;
BufferedWriter ownbw=null;
try {
br=new BufferedReader(new InputStream()));
ownbw=new BufferedWriter(new OutputStream()));
} catch (IOException e) {
} catch (IOException e) {
ve(this);
throw new RuntimeException("获取流失败!");
}
String str=null;
try {
while((adLine())!=null){
String[] split = str.split(":", 2);
if(split.length<=1){
ownbw.write("数据格式错误!");
ownbw.flush();
}
String desip=split[0];
String content=split[1];
BufferedWriter desbw=null;
boolean isOnLine=false;
for(Transport des:Server.clients){
if(desip.equals(des.ip)){
isOnLine=true;
desbw=new BufferedWriter(new OutputStreamWriter(OutputStream()));
desbw.write(str);
javaswing实现购买desbw.flush();
}
}
if(!isOnLine){
ownbw.write("对⽅不在线!");
ownbw.flush();
}
}
} catch (IOException e) {
ve(this);
throw new RuntimeException("获取流失败!");
}
}
}
------------------------------------------------------------
package 聊天室swing版.client;
/**
* 客户端类,向服务器发送信息,以及接收服务器发来的信息
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.Socket;
import 聊天室swing版.ui.UIclient;
import 聊天室swing版.ui.UIserver;
import 聊天室swing版.utils.HostInfo;
import 聊天室swing版.utils.Release;
public class Client extends Thread {
private Socket socket;
@Override
public void run() {
try {
socket=new Socket(UIserver.Text().toLowerCase(), Integer.parseInt(UIserver.Text().trim())); } catch (IOException e) {
throw new RuntimeException("客户端创建失败!");
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论