`

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();
}
}

 

分享到:
评论

相关推荐

    Socket服务端客户端以tcp/ip协议发送接收报文

    在IT领域,网络通信是不可或缺的一部分,而Java Socket编程则是实现网络通信的一种常见方式,尤其在TCP/IP协议栈上。本教程将详细讲解如何利用Java Socket实现基于TCP/IP的服务端和客户端之间的报文发送与接收。 ...

    基于c/s架构的JAVA聊天程序 ,服务端和客户端都有

    1. **Socket编程**:Java的java.net.Socket和ServerSocket类用于建立客户端和服务器之间的连接,实现数据的双向传输。 2. **多线程**:服务器通常需要同时处理多个客户端的请求,因此会用到多线程技术,每个客户端...

    基于Java实现C/S架构的聊天系统

    同时,深入研究QQ_Server和QQ_Client中的源代码,可以让你更直观地了解如何在Java中实现C/S架构的聊天系统,以及如何应用NIO、Socket和多线程技术。通过这样的实践,你不仅能提升Java编程技能,还能增强对网络编程和...

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

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

    JAVA_C- S聊天程序 Socket 多线程 点对点 点对多

    总的来说,这个Java_C-S聊天程序涉及了Socket编程、多线程技术、以及点对点和点对多的通信模式,是学习网络编程和并发处理的一个典型实例。通过研究和实践这个项目,开发者可以深入理解这些概念,并提升在实际应用中...

    多线程实现服务端

    在IT领域,多线程是实现高性能服务器的关键技术之一。多线程允许一个应用程序同时执行多个不同的任务,从而提高效率,特别是在处理并发连接时。在这个场景下,"多线程实现服务端"指的是通过创建和管理多个线程来构建...

    flex的socket客户端连接java多线程socket服务端demo

    多线程在Java Socket服务端的应用是关键,因为如果所有客户端都在同一个线程中处理,那么服务端将无法同时处理多个并发请求。通过创建一个新的线程来处理每个客户端连接,服务端可以有效地并行处理多个客户端的请求...

    java多线程+Socket+Swing做的局域网聊天程序

    【标题】"java多线程+Socket+Swing做的局域网聊天程序"涉及的核心知识点主要涵盖Java编程、多线程、网络通信以及图形用户界面设计。以下将详细阐述这些关键概念及其在实现局域网聊天程序中的应用。 **1. Java编程**...

    多线程Java_Socket编程示例

    本文介绍了一个基于Java的多线程Socket编程示例,通过对服务端实现的分析,我们可以了解到如何利用Java的多线程技术和Socket通信来构建高性能的网络应用程序。这种编程方式特别适合处理大量的并发连接,是构建实时...

    利用socket连续发送与连续接收数据

    在IT领域,网络编程是不可或缺的一部分,而Socket编程则是实现网络通信的基础。本文将深入探讨如何利用Socket进行连续发送与连续接收数据,基于标题“利用socket连续发送与连续接收数据”以及描述中提到的实现过程。...

    java 多线程 socket聊天程序

    Java多线程Socket聊天程序是基于Java编程语言实现的一个网络通信应用,主要涉及了Java的Socket编程和多线程技术。这两个核心概念在Java中占据了非常重要的地位,特别是在开发网络应用和服务端系统时。 首先,Java ...

    基于C/S模式的Java聊天室

    总的来说,基于C/S模式的Java聊天室项目涵盖了网络编程、多线程、GUI设计、数据结构、安全性以及服务端优化等多个Java编程的重要知识点,是学习和提升Java技能的绝佳实践项目。开发者在实现这样一个系统时,不仅能...

    TCP-socket.zip_java_java Tcp _java socket _socket_socket多线程

    这个学习资源可以帮助我们深入了解Java中的TCP Socket编程和多线程技术。 首先,让我们来看看TCP协议。TCP是一种面向连接的、可靠的传输协议,它保证了数据包在传输过程中的顺序和完整性。通过三次握手建立连接,四...

    java的Socket实现的多人聊天程序

    总的来说,这个Java的Socket实现的多人聊天程序是一个很好的学习示例,涵盖了网络编程、多线程、并发控制以及用户界面设计等多个方面的知识。通过分析和研究这个项目,开发者可以深入理解Java的Socket通信机制,为...

    \\(^_^)/ Java 使用Socket多线程传输整个文件夹

    在Java编程中,Socket通信是网络应用程序之间进行数据交换的基础,尤其在文件传输...总的来说,使用Java的Socket和多线程技术实现文件夹传输是一项复杂的任务,需要掌握网络编程、多线程、文件操作等多个方面的知识。

    仿QQ聊天程序SOCKET编程服务端与客户端.rar_java qq_java socket _socket 仿QQ聊天_仿QQ

    在本项目中,我们主要探讨的是使用Java语言和Socket编程技术来实现一个仿QQ的聊天程序,涵盖了服务端和客户端的开发。这个程序允许多个用户同时在线进行交流,类似于一个简单的聊天室。以下是对相关知识点的详细说明...

    Java Socket网络编程研究.pdf

    在Java中,Socket编程是实现网络通信的基本手段,它允许应用程序之间通过网络进行数据交换。本文将详细探讨Java Socket网络编程中的关键知识点。 首先,我们回顾一下网络通信的发展历史。通信技术的发展经历了从...

    myInternet_3.rar

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

    java socket服务端和客户端

    - 这些流对象是`InputStream`和`OutputStream`的子类,可以读取或写入字节数据,实现数据的双向传输。 4. **数据传输**: - 数据传输通常是基于字节流的,可以使用`DataInputStream`和`DataOutputStream`对基本...

Global site tag (gtag.js) - Google Analytics