Socket 客户端-服务器(C-S)通信实验
2016-04-24 09:19
363 查看
学习计算机网络编程也有一段时间了,对这段时间学习的东西做一个小总结吧,主要是基于socket,实现客户端和服务器的通信,编程用java语言。具体的实验要求如下:
设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的数据的发送和接收(S发给C,C发给S)。
服务端程序能响应单个或任意多个客户端连接请求;服务端能向单个客户发送消息,支持群发消息给所有客户端;
通信的双方具备异常响应功能,包括对方异常退出的处理。如果客户端退出,服务器有响应;反之亦然。
Client-Server通信效果的图片说明:
编程实现的思路:在服务器端,首先要启动一条线程用于监听某个指定端口(比如:8000),并且还要再开一条线程用于接收消息,客户端尝试连接该端口(8000),如果成功连接则会返回一个Socket类的实例对象(Socket socket = serversocket.accept();) ,很显然服务器端便应该保存有一个客户列表(比如可以用:ArrayList),使得服务器可以发消息给某个指定的客户端。而客户端在连接服务器之后也应该启动一条线程用于接收消息。当某个客户端进来时,便发送Login消息给服务器,服务器将此消息广播发给当前在线的所有用户,当某个客户端退出时,发送Logout消息给服务器,服务器将此消息广播发给当前在线的所有用户,当客户端之间进行通信时,会发送Talk消息给服务器,服务器再将此消息转发给指定的客户端,也就是所有的通信都是通过服务器进行转发的。
主要的代码实现如下:
服务器端:
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import javax.swing.JScrollBar;
public class ChatServer extends javax.swing.JFrame {
ArrayList<User> list = new ArrayList<User>();
static String local;
int port = 8000;
boolean isNomalexit = false;
Mythread jtThread;
public ChatServer() {
initComponents();
this.setTitle("服务器");
this.setResizable(false);
this.setLocationRelativeTo(null);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
dispose();
}
});
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { } //开始监听按钮的事件
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { } //停止监听按钮的事件
class Mythread extends Thread{ } //负责监听端口8000的线程
class ClientThread extends Thread{ } //负责接收消息的线程
public void sendtoclient(User user,String message){ } //发送消息message给用户,user为发送者
public void sendtoallclient(User user,String message){ } //发送消息message给所有用户,user发送者
public void removeuser(User user){ }
public static void main(String args[]) throws UnknownHostException {
local = InetAddress.getLocalHost().getHostAddress();
ChatServer frame = new ChatServer();
frame.setVisible(true);
}
客户端:
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JScrollBar;
public class ChatClient extends javax.swing.JFrame {
Socket s;
boolean isExit = false;
DataInputStream in;
PrintStream out;
ArrayList<String> list =new ArrayList<String>();
static String name;
ReceivemessageThread thread;
public ChatClient() {
initComponents();
this.setTitle("客户端");
this.setResizable(false);
this.setLocationRelativeTo(null);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
if(s!=null){
sendmessage("Logout " + name);
try {
isExit = true;
in.close();
out.close();
s.close();
} catch (IOException ex) {
Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){ } //登录按钮的事件
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt){ } //发送按钮的事件
class ReceivemessageThread extends Thread{ } // 接收消息的线程
public void sendmessage(String message){ } //发送消息
public void removeuser(String name){ } //移除在线列表上的用户名
public static void main(String args[]) {
ChatClient frame = new ChatClient();
frame.setVisible(true);
}
运行演示:
在做完这个程序之后,对于网络编程也算是基本上入门了,后续还会有很多的通信程序,因为这门课的要求就是做一个类似QQ的通信程序,写下这篇博客也算是记录自己的学习进程。
相关文章推荐
- Activity保存与恢复状态。。。点击事件的方法。。关闭Activity
- Objective-C:runtime
- 3月30日作业:采购管理、信息管理和配置管理
- mvn是什么
- Android 使用Get方式实现断点下载(一)
- struts2中获取request、session、response、application方式
- C#_会员管理系统:开发五(用户注册)
- 为什么你有10年经验,但成不了专家?
- poj 3273
- Java可见性机制的原理
- FZU-1054 阅读顺序(水、反转字符串处理)
- LeetCode 303. Range Sum Query - Immutable
- 【BZOJ-1692&1640】队列变换 后缀数组 + 贪心
- 学习进度条——第八周
- 金山游侠修改内存
- 中医
- 【GDOI 2016模拟4.23】闷声
- hdu 2089 不要62 (数位DP)
- HDU-1219 AC Me (水)
- Activity的常用方法和生命周期