问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用java多线程实现服务器与客户端原理

发布网友 发布时间:2022-04-25 15:43

我来回答

2个回答

热心网友 时间:2022-04-25 14:34

服务器端:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.Vector;
public class OneToMoreServer extends JFrame implements ActionListener{
JPanel contentPane;
JLabel jLabel2 = new JLabel();
JTextField jTextField2 = new JTextField("4700");
JButton jButton1 = new JButton();
JLabel jLabel3 = new JLabel();
JTextField jTextField3 = new JTextField();
JButton jButton2 = new JButton();
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();
ServerSocket server = null;
Socket socket = null;BufferedReader instr =null;PrintWriter os=null ;
Vector vector=new Vector();
boolean serverRun=true;
boolean clientRun=true;
//Construct the frame
public OneToMoreServer() {
jbInit();

}

class MyThread extends Thread{//该线程负责接收数据
Socket socketI=null;
BufferedReader br=null;
public MyThread(Socket socket)
{
socketI=socket;
}
public void run(){
try{
while(clientRun){
this.sleep(100);
br= new BufferedReader(new InputStreamReader(socketI.getInputStream()));
if(br.ready()){ //检查是否有数据
jTextArea1.append("接收到来自客户端("+socketI.getInetAddress().toString()+")的消息: "+br.readLine()+"\n");
}
}
}catch(Exception ex){JOptionPane.showMessageDialog(null,ex.toString());}
}
}

public void actionPerformed(ActionEvent e){
if(e.getSource()==jButton1){
int port=Integer.parseInt(jTextField2.getText().trim());
//监听指定端口
try
{
server = new ServerSocket(port);
new Thread(new ListenClient()).start();
}
catch(IOException ex)
{
JOptionPane.showMessageDialog(null,ex.toString());
}
}
if(e.getSource()==jButton2){
String msg=jTextField3.getText().trim();
if(msg.length()!=0)
sendData("hello");
}
}
//该线程负责监听指定端口
class ListenClient implements Runnable
{
public void run()
{
try{
if(jButton1.getText().trim().equals("侦听")){
jButton1.setText("正在侦听...");
while(serverRun)
{
Socket socketI=server.accept();//有客户端连入时建立一个线程监听客户端发送的消息
vector.add(socketI);
jButton1.setText("正在聊天...");
jTextArea1.append("客户端"+socketI.getInetAddress().toString()+"已经连接到服务器\n");
MyThread t=new MyThread(socketI);
t.start();
}
}
}catch(Exception ex){
JOptionPane.showMessageDialog(null,ex.toString());
}
}
}

private void sendData(String s){//发送数据
try{
for(int i=0;i<vector.size();i++)
{
//怎么广播?????
//向每个客户端发送一条消息
Socket socket=(Socket)vector.get(i);
os= new PrintWriter(socket.getOutputStream());
os.println(s);
os.flush();
}
}catch(Exception ex){
}
}

private void jbInit() {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(null);
this.setSize(new Dimension(540, 340));
this.setTitle("服务器");
jLabel2.setBounds(new Rectangle(22, 27, 72, 28));
jLabel2.setText("端口号");
jLabel2.setFont(new java.awt.Font("宋体", 0, 14));
jTextField2.setBounds(new Rectangle(113, 27, 315, 24));

jButton1.setBounds(new Rectangle(440, 28, 73, 25));
jButton1.setFont(new java.awt.Font("Dialog", 0, 14));
jButton1.setBorder(BorderFactory.createEtchedBorder());
jButton1.setActionCommand("jButton1");
jButton1.setText("侦听");
jLabel3.setBounds(new Rectangle(23, 57, 87, 28));
jLabel3.setText("请输入信息");
jLabel3.setFont(new java.awt.Font("宋体", 0, 14));
jTextField3.setBounds(new Rectangle(114, 60, 314, 24));
jTextField3.setText("");
jButton2.setText("广播");
jButton2.setActionCommand("jButton1");
jButton2.setBorder(BorderFactory.createEtchedBorder());
jButton2.setFont(new java.awt.Font("Dialog", 0, 14));
jButton2.setBounds(new Rectangle(440, 58, 73, 25));
jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189));

contentPane.add(jTextField2, null);
contentPane.add(jButton1, null);
contentPane.add(jLabel3, null);
contentPane.add(jTextField3, null);
contentPane.add(jButton2, null);
contentPane.add(jScrollPane1, null);
contentPane.add(jLabel2, null);
jScrollPane1.getViewport().add(jTextArea1, null);
jButton1.addActionListener(this);
jButton2.addActionListener(this);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
try{
socket.close();
instr.close();
System.exit(0);
}catch(Exception ex){
//JOptionPane.showMessageDialog(null,ex.toString());
}

}
});
}
public static void main(String arg[]){
JFrame.setDefaultLookAndFeelDecorated(true);
OneToMoreServer frm=new OneToMoreServer();
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}

客户端
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
public class Client extends JFrame implements ActionListener{
JPanel contentPane;
JLabel jLabel1 = new JLabel();
JTextField jTextField1 = new JTextField("127.0.0.1");
JLabel jLabel2 = new JLabel();
JTextField jTextField2 = new JTextField("4700");
JButton jButton1 = new JButton();
JLabel jLabel3 = new JLabel();
JTextField jTextField3 = new JTextField();
JButton jButton2 = new JButton();
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();
BufferedReader instr =null;
Socket socket = null;
PrintWriter os=null;
public Client() {
jbInit();
}
class MyThread extends Thread{
public void run(){
try{
os=new PrintWriter(socket.getOutputStream());
instr=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true)
{
this.sleep(100);
if(instr.ready())
{
jTextArea1.append("接收到来自服务器的消息: "+instr.readLine()+"\n");
}
}
}catch(Exception ex){
JOptionPane.showMessageDialog(null,ex.toString());
}
}
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==jButton1){
String ip=jTextField3.getText().trim();
int port=Integer.parseInt(jTextField2.getText().trim());
connectServer(ip,port);
}
if(e.getSource()==jButton2){
String s=this.jTextField3.getText().trim();
sendData(s);
}
}
private void connectServer(String ip,int port){//连接
try{
if(jButton1.getText().trim().equals("连接")){
jButton1.setText("连接服务器...");
socket=new Socket(ip,port);
jButton1.setText("正在聊天");
MyThread t=new MyThread();
t.start();
}
}catch(Exception ex){
JOptionPane.showMessageDialog(this,ex.toString());
}
}
private void sendData(String s){//发送数据
try{
os = new PrintWriter(socket.getOutputStream());
os.println(s);
os.flush();
this.jTextArea1.append("向服务器发送消息:"+s+"\n");
}catch(Exception ex){
JOptionPane.showMessageDialog(this,ex.toString());
}
}
private void jbInit() {
contentPane = (JPanel) this.getContentPane();
jLabel1.setFont(new java.awt.Font("宋体", 0, 14));
jLabel1.setText("服务器名称");
jLabel1.setBounds(new Rectangle(20, 22, 87, 28));
contentPane.setLayout(null);
this.setSize(new Dimension(540, 340));
this.setTitle("客户端");

jTextField1.setBounds(new Rectangle(114, 26, 108, 24));
jLabel2.setBounds(new Rectangle(250, 25, 72, 28));
jLabel2.setText("端口号");
jLabel2.setFont(new java.awt.Font("宋体", 0, 14));
jTextField2.setBounds(new Rectangle(320, 27, 108, 24));

jButton1.setBounds(new Rectangle(440, 28, 73, 25));
jButton1.setFont(new java.awt.Font("Dialog", 0, 14));
jButton1.setBorder(BorderFactory.createEtchedBorder());
jButton1.setActionCommand("jButton1");
jButton1.setText("连接");
jLabel3.setBounds(new Rectangle(23, 57, 87, 28));
jLabel3.setText("请输入信息");
jLabel3.setFont(new java.awt.Font("宋体", 0, 14));
jTextField3.setBounds(new Rectangle(114, 60, 314, 24));

jButton2.setText("发送");
jButton2.setActionCommand("jButton1");
jButton2.setBorder(BorderFactory.createEtchedBorder());
jButton2.setFont(new java.awt.Font("Dialog", 0, 14));
jButton2.setBounds(new Rectangle(440, 58, 73, 25));
jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189));

contentPane.add(jLabel1, null);
contentPane.add(jTextField1, null);
contentPane.add(jLabel2, null);
contentPane.add(jTextField2, null);
contentPane.add(jButton1, null);
contentPane.add(jLabel3, null);
contentPane.add(jTextField3, null);
contentPane.add(jButton2, null);
contentPane.add(jScrollPane1, null);
jScrollPane1.getViewport().add(jTextArea1, null);
jButton1.addActionListener(this);
jButton2.addActionListener(this);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
try{
socket.close();instr.close();os.close();System.exit(0);
}catch(Exception ex){
JOptionPane.showMessageDialog(null,ex.toString());
}
}
});
}
public static void main(String arg[]){
JFrame.setDefaultLookAndFeelDecorated(true);
Client frm=new Client();
frm.setVisible(true);
}
}

热心网友 时间:2022-04-25 15:52

// 在服务器上部署的程序

package wang.socket.Server;
// java 提供的网络功能包
import java.net.*;
// java 提供的输入输出的功能包
import java.io.*;

// 使用线程来处理Socket请求
public class ThreadServer {

public static void main(String[] args) throws Exception {

// 监听服务
ServerSocket server;
// 启动一个监听服务器
server = new ServerSocket(9999);
System.out.println("---------> 一个Socket监听服务器启动:" + server.toString());
while (true) {//循环地响应客户端的请求

//获得客户端连接,也就是要建立一个Socket套接字,由于没有使用线程,多个客户端连接会排队
// ServerSocket的接收套接字的方法是采用队列并等待的方式,如果没有呼入连接,则程序在等待,不向下执行.
Socket client = server.accept();
// 创建线程,让线程去应答客户的请求
new ServerThread(client).start();

}
}
}

// 以线程处理客户的请求
class ServerThread extends Thread {
//主程序的main函数会把创建的Socket作为参数传递给线程执行.

private Socket sk;

public ServerThread(Socket s) {
this.sk = s;
}

@Override
public void run() {
System.out.println("(一个客户请求:)" + this.sk.toString());
// 缓冲区读取器
BufferedReader in;
// 响应器
PrintWriter out;
// 取得客户端的计算机的IP地址
String remoteIP = this.sk.getInetAddress().getHostAddress();
// 取得客户端用于通讯的端口号
int remotePort = this.sk.getLocalPort();
// 在服务器的监控台上显示客户端接入的信息
System.out.println("一个客户端正在连入, IP:" + remoteIP + ", 端口: " + remotePort);

//获得 client 端的输入输出流,为进行交互做准备
try {
in = new BufferedReader(new InputStreamReader(this.sk.getInputStream()));
//获得输出
out = new PrintWriter(this.sk.getOutputStream(), true);

//获得 client 端发送的数据,要注意的是客户端从一个套接字里有可能发送多行的数据。
String content;
// 只有比较明显地给出一个数据流终结的方式才好
while (!(content = in.readLine()).equals("taxend")) {

System.out.println("客户端发来的消息: " + content);
out.println(content);
// 向 client 端发送响应数据
}
//关闭各个流
// out.flush(); 清缓冲区

out.close();
in.close();
// 一次通讯结束,可以关闭socket
this.sk.close();
} catch (Exception ex) {
// ex.printStackTrace();
System.out.println("客户挂断了.........");
}

}
}

// 在客户端部署的程序

package wang.socket.Client;

import java.net.*;
import java.io.*;

/**
*
* @author WangQingda
*/
public class AWTClient extends javax.swing.JFrame {

/** Creates new form AWTClient */
public AWTClient() {

initComponents();
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
theServerIP = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
theContent = new javax.swing.JTextArea();
jButton1 = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
theServerOutPut = new javax.swing.JTextArea();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("测试Socket数据流");

jLabel1.setText("请输入服务器地址:");

jLabel2.setText("输入需要提交数据流:");

theServerIP.setText("127.0.0.1");

theContent.setColumns(20);
theContent.setRows(5);
jScrollPane1.setViewportView(theContent);

jButton1.setLabel("提交");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

theServerOutPut.setColumns(20);
theServerOutPut.setRows(5);
jScrollPane2.setViewportView(theServerOutPut);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane2))
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addGap(31, 31, 31)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 317, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(18, 18, 18)
.addComponent(theServerIP, javax.swing.GroupLayout.PREFERRED_SIZE, 167, javax.swing.GroupLayout.PREFERRED_SIZE)))))
.addContainerGap(31, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(41, 41, 41)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(theServerIP, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addGap(34, 34, 34)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jButton1))
.addGroup(layout.createSequentialGroup()
.addGap(18, 18, 18)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(13, Short.MAX_VALUE))
);

pack();
}// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try {
//连接 server 端
System.out.println("连接服务器 ...");
Socket client = new Socket(this.theServerIP.getText(), 9999);

//显示已连接
System.out.println("成功接入服务器.");
System.out.println();

//为发送数据做准备
System.out.println("请输入:");
// 注意字符串要以字符流的形式读入。
BufferedReader in = new BufferedReader(new StringReader(this.theContent.getText()));
// 流的输出可以从socket的输出流得到。
PrintWriter out = new PrintWriter(client.getOutputStream(), true);

// 向 server 发送数据
String outTxt;
while ((outTxt = in.readLine()) != null) {
out.println(outTxt);
System.out.println("向服务器发送:"+outTxt);

}
out.flush();
this.theServerOutPut.append("数据已经成功向服务器发送");
//接收来自 server 的响应数据
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String inTxt;
while ((inTxt = in.readLine()) != null) {
this.theServerOutPut.append(inTxt);

}
// 关闭各个流
in.close();
out.close();
// 客户端退出
client.close();

} catch (Exception e) {
e.printStackTrace();
}
}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
new AWTClient().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea theContent;
private javax.swing.JTextField theServerIP;
private javax.swing.JTextArea theServerOutPut;
// End of variables declaration
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...时间会发作,很痛的,请问是这样吗?会痛多久? ...已经坏了,如今全身浮肿,尿排不出,医生说就这 我爷爷得了肝癌晚期,腹水,不能手术.听说氩氦超冷刀技术能治.哪里有... 父亲59岁得了肝癌晚期,医生说最多半年时间了,上面还有80多岁的爷爷... 长春跑大连的列车员,怎么区分正式分和临时工呢? 员工刚怀孕就被开除,开除负责人拒不认错,你如何看待该公司的态度?_百 ... 员工在职期间怀孕,老板可以无故迟退吗? 老板开除怀孕女员工违法吗 如何选购蚊帐 什么样的蚊帐最好 一个男生突然换上猫咪头像是为什么? 怎样给软件加上试用期或使用次数或注册码 如何给软件加个加密狗? 苹果如何给软件加密码? 华为手机怎样给软件加锁 怎么在空间里面保留个性签名 怎么保持个性签名不变 如何保留脏衣服上的签名 如何在洗衣服时保留上面的签名笔迹? 求翻译。英文合同。非常感谢。高手请进! 跪求翻译急 钓鱼大师第二季角色怎么重置 钓鱼大师第二季 rare什么意思 钓鱼大师第三季如何退出公会 !急!急!急!急!急!急!急!急! 有谁能把钓鱼大师翟少明的简介发给我? 手游钓鱼大师第五季怎么打不开游戏 魔兽钓鱼大师级地点 梦见去动物园被蟒蛇追 录屏超级录屏的软件为什么打开它就一下就快闪看不见了呢? 请问魔兽世界的钓鱼大赛怎么参加? 猫咪头像姐妹俩带字 意境安静有猫咪头像 java中如何实现多线程? 这只猫咪头像是出自哪里,是动漫角色吗 请问java多线程怎么实现 怎么实现java多线程 java 多线程的实现方式 java多线程实现 上海有什么地方好玩的呀 去上海必玩的地方有哪些 上海可以到海边玩的地方有哪些? 上海市里哪有好玩的地方! 英雄联盟 经典语录 上海最好玩的地方是哪? 《lol》英雄超燃台词有哪些? 上海最值得游玩的好地方在哪里? 短信中心号码 山东 有哪些让你心神触动的《英雄联盟》台词? 上海都有什么地方可以玩 10694099102592011455是什么短信号码?