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

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

服务器端:

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 = nullBufferedReader instr =nullPrintWriter 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=0i<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)

}

}

如何用Java实现Web服务器 一、HTTP协议的作用原理

WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。HTTP协议的作用原理包括四个步骤:

(1) 连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。

(2) 请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:

GET 路径/文件名 HTTP/1.0

文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。

(3) 应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/280608.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-21
下一篇2023-04-21

发表评论

登录后才能评论

评论列表(0条)

    保存