`

Java Socket编程之多线程实现C/S一对多(服务端无法发送数据)

 
阅读更多

Server端:

package com.wjy.server;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/*
 * caution:boot the server first.
 * @author JiyuanWang
 *
 */
public class TalkServer extends JFrame implements ActionListener,Runnable{
    private  JButton send=null;
    private  JTextField inputText=null;
    private  JTextArea showText=null;
    private  ServerSocket serverSocket=null;
    private DataOutputStream out=null;
    public TalkServer(){
    }
public  void handle()
{
    try {
        serverSocket=new ServerSocket(4170, 5);
        
        while (true) {
            Socket socket=serverSocket.accept();
            showText.append("Connect successd.\n");
            Thread thread=new ThreadHandle(socket);
            thread.start();
            
        }
        
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
}
@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub    
        /*try {
            out.writeUTF(inputText.getText());
            out.flush();//本人一直把这个程序调试不通,最后发现没加这句话导致服务端显示不了客户端的输入。
            showText.append("I said: "+inputText.getText()+"\n");
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }*/
}
@Override
public void run() {
    // TODO Auto-generated method stub
    send=new JButton("Send");
    send.addActionListener(this);
    send.setEnabled(true);
    
    inputText=new JTextField();
    
    showText=new JTextArea();
    
    add(send,BorderLayout.NORTH);
    add(inputText, BorderLayout.SOUTH);
    add(showText, BorderLayout.CENTER);
    
    setTitle("Server");
    setBounds(1000,0,400,400);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    handle();
}
private class ThreadHandle extends Thread{
    private Socket midSocket;
    public ThreadHandle(Socket midSocket){
        this.midSocket=midSocket;
    }
    public void run() {
        
        try {
            DataInputStream dataInputStream=new DataInputStream(midSocket.getInputStream());
            DataOutputStream dataOutputStream=new DataOutputStream(midSocket.getOutputStream());
            while(true){
            showText.append("Client said: "+dataInputStream.readUTF()+"\n");
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
}

Client端:

package com.wjy.client;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * caution:boot the server first.
 * @author JiyuanWang
 *
 */

public class TalkClient extends JFrame implements ActionListener,Runnable{
    private  JButton send=null;
    private  JTextField inputText=null;
    private  JTextArea showText=null;
    private  Socket socket=null;
    private  DataInputStream inputStreamReader=null;
    private  DataOutputStream outputStreamWriter=null;
    public TalkClient(){
    }
public void handle()
{
    try {
        socket=new Socket("127.0.0.1",4170);
        inputStreamReader=new DataInputStream(socket.getInputStream());
        outputStreamWriter=new DataOutputStream(socket.getOutputStream());
        while(true){
            showText.append("The Server said: "+inputStreamReader.readUTF()+"\n");
        }
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    try {
        outputStreamWriter.writeUTF(inputText.getText());
        outputStreamWriter.flush();   //本人一直把这个程序调试不通,最后发现没加这句话导致服务端显示不了客户端的输入。
        showText.append("I said: "+inputText.getText()+"\n");
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
}
@Override
public void run() {
    // TODO Auto-generated method stub
    send=new JButton("Send");
    send.addActionListener(this);
    send.setEnabled(true);
    
    inputText=new JTextField();
    
    showText=new JTextArea();
    
    add(send,BorderLayout.NORTH);
    add(inputText, BorderLayout.SOUTH);
    add(showText, BorderLayout.CENTER);
    
    setTitle("Client");
    setBounds(0,0,400,400);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    handle();
}
}

main函数:

package start;

import java.io.IOException;
import java.net.ServerSocket;

import com.wjy.client.TalkClient;
import com.wjy.server.TalkServer;

public class start {
public static void main(String[] args){
    Thread server=new Thread(new TalkServer());
    Thread clientA=new Thread(new TalkClient()); 
    Thread clientB=new Thread(new TalkClient()); 
    server.start();
    clientA.start();
    clientB.start();
}
}

 

分享到:
评论

相关推荐

    一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能)

    实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了...

    myInternet_3.rar

    图形界面编程,利用socket和UDP/TCP编写,客户端和服务端程序可以进行多次对话。实现了一对一多次对话,里面运用了网络编程和多线程编程。

    Java TCPIP Socket编程 源码

    一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端,一般在TCP Socket编程中,客户端有多个,而服务器端只有一个,客户端TCP向服务器端TCP发送连接请求,服务器端的...

    聊天室 Java EE编程技术论文

    网络聊天室是一种应用广泛网络聊天方式,操作简单,功能丰富,本论文是JAVA语言设计和实现一个网络聊天室的过程,采用C/S架构设计,整个项目分为服务器和客户端。使用了JAVA 2中SWING组件,开发出简洁美观的用户和...

    java版碟片租赁系统课程设计

    系统采用c/s架构,不是简单的单机版! 当然,你可以服务端、客户端都在同一台电脑上...通过此项目,可以学习了解到C/S模式、java Swing图形界面编程、java 多线程、java Socket网络编程、java对数据库的操作等知识。

    基于Java的网络聊天系统的设计与实现(源码+说明文档)

    本文使用的网络编程模型是客户端/服务端(C/S)结构,遵循TCP和UDP协议,网络聊天功能通过socket模块实现,用户在客户端上登录到指定端口的服务端与其他用户进行网络聊天。服务器启动后,等待客户端的连接,转发客户端指定...

    网络实训基于Java的网络聊天软件的设计与实现

    本文使用的网络编程模型是客户端/服务端(C/S)结构,遵循TCP和UDP协议,网络聊天功能通过socket模块实现,用户在客户端上登录到指定端口的服务端与其他用户进行网络聊天。服务器启动后,等待客户端的连接,转发客户端指定...

    java源码包---java 源码 大量 实例

     Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...

    java写的一个简单基于tcp协议的多用户聊天系统

    用j2se写的一个简单的聊天系统,写了客户端和服务器。用到了socket,流读写技术,服务器端采用了多线程等技术。基本上涵盖了j2se中所有学到的技术,非常适合学习了j2se的初学者练习使用。

    Java超神之路.rar

    2.多线程并发编程,现在并发几乎是写服务端程序必须的技术,那对Java中的多线程就要有足够的熟悉,包括对象锁机制、synchronized关键字,concurrent包都要非常熟悉,这部分推荐你看看《Java并发编程实践》这本书,...

    JAVA上百实例源码以及开源项目源代码

     Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...

    JAVA上百实例源码以及开源项目

     Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket...

Global site tag (gtag.js) - Google Analytics