`

Java之Socket编程之简单聊天程序

阅读更多
一、界面截图:




二、代码:


1、ChatServer.java

package com.lixh1986.socket.server;

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

import com.lixh1986.socket.model.ServerSideSocket;

public class ChatServer {
    
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        
        ArrayList<ServerSideSocket> pool = new ArrayList<ServerSideSocket>(); 
        
        try {
            
            ServerSocket serverSocket = new ServerSocket(9999);
            
            System.out.println("Server starts up!");
            
            while(true){
                /**
                 * ServerSocket.accept();
                 *
                 Listens for a connection to be made to this socket and accepts it. 
                 The method blocks until a connection is made. 

                 A new Socket corresponding to the client socket is created, and this
                 socket will be used for making communication with the client socket. 
                 
                 */
                ServerSideSocket serverSideSocket = 
                    new ServerSideSocket(pool, serverSocket.accept());
                Thread t = new Thread(serverSideSocket);
                System.out.println("socket thread: " + t.getName() + " starts serving.");
                t.start();
            }
            
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

}




2、ServerSideSocket.java

package com.lixh1986.socket.model;

import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;

public class ServerSideSocket implements Runnable {
    
    private Socket socket;    
    private ArrayList<ServerSideSocket> pool;
    
 
    public ServerSideSocket(ArrayList<ServerSideSocket> pool, Socket socket){
        this.pool = pool;
        this.socket = socket;
        this.pool.add(this);
        System.out.println("A client connected!");
    }
    
    
    @Override
    public void run() {
        receiveMessage();
    }
    
    /**
     * read data from ClientSideSocket.
     */
    private void receiveMessage(){
        try {
            byte[] bytes = new byte[1024];
            int n = 0;
            boolean isUserSendQuit = false;
            while(!isUserSendQuit){
                while ( (n = socket.getInputStream().read(bytes)) != -1){
                    String str = new String (bytes, 0, n);
                    // broadcast this message to other client.
                    for(ServerSideSocket otherSocket : pool){
                        if(this != otherSocket){
                            otherSocket.writeMessage(str);
                        }
                    }
                }
            }
        } catch (IOException e1) {
            System.out.println("receiveMessage:");
            System.out.println("A client disconnected!");
        }finally{
            disconnect();
        }
    }
    
    
    /**
     * write data to ClientSideSocket.
     * @param message
     */
    public void writeMessage(String message){
        try {
            socket.getOutputStream().write(message.getBytes());
            socket.getOutputStream().flush();
        } catch (IOException e1) {
            System.out.println("writeMessage:");
            System.out.println("A client disconnected!");
            disconnect();
        }
    }
   
    
    private void disconnect(){
        if(pool.remove(this)){
            System.out.println("A client is removed successfully!");
            System.out.println("pool size: " + pool.size());
        }else{
            System.out.println("A client is not removed!");
        }
        try {
            if(socket != null) socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}






3、ClientSideSocket.java

package com.lixh1986.socket.client;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

@SuppressWarnings("resource")
public class ClientSideSocket {
   
    public static void main(String[] args) {
        try {
            
            final Socket socket = new Socket("127.0.0.1", 9999);
            final Scanner scanner = new Scanner(System.in);
            
            System.out.println("I am a client!");
            
       
            new Thread(new Runnable() {
                @Override
                public void run() {                        
                    try {
                        while(true){
                            String str = scanner.nextLine();
                            socket.getOutputStream().write(str.getBytes());
                            socket.getOutputStream().flush();
                        }
                    } catch (IOException e) {
                        System.out.println("Writing Quit.");
                        System.exit(0);
                    }
                }
            }).start();
            
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        byte[] bytes = new byte[1024];
                        int n = 0;
                        while(true){
                            while ( (n = socket.getInputStream().read(bytes)) != -1){
                                String str = new String (bytes, 0, n);
                                System.out.println(str);
                            }
                        }                        
                     } catch (IOException e) {
                         System.out.println("Reading Quit.");
                         System.exit(0);
                     }
                }
            }).start();
            
            
            
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    

}






三、Java Socket通信原理图






四、Java Socket 编程进阶


Will I need a separate socket and thread for every player that joins? [JAVA]
服务器端是否应该为每一个客户端创建一个线程?

I have been learning about sockets for sometime now (I'm quite young) and I think I have a good grip on java sockets. I have decided to create a simple multiplayer Java 2D social game. My goal is to have the server output players' X,Y coordinates and chat every 10 milliseconds. From what I have read, my very average logic tells me that only one user at a time can connect to a socket. So therefore I will need a separate thread and socket for each player that connects.

Is it necessary to have one ServerSocket and thread per player?


Answer:

You should have just one ServerSocket listening on a port that is known to the client. When a client connects to the server, a new Socket object is created and the original ServerSocket goes back to listening again. You should then spin off a new Thread or hand over to an Executor the actual work of talking to the client, otherwise your server will stop listening for client connections.

Here is a very basic sketch of the code you will need.


import java.net.*;
import java.util.concurrent.*;

public class CoordinateServer {
  public static void main(String... argv) throws Exception {
    // 'port' is known to the server and the client
    int port = Integer.valueOf(argv[0]);
    ServerSocket ss = new ServerSocket(port);

    // You should decide what the best type of service is here
    ExecutorService es = Executors.newCachedThreadPool ();

    // How will you decide to shut the server down?
    while (true) {
      // Blocks until a client connects, returns the new socket 
      // to use to talk to the client
      Socket s = ss.accept ();

      // CoordinateOutputter is a class that implements Runnable 
      // and sends co-ordinates to a given socket; it's also
      // responsible for cleaning up the socket and any other
      // resources when the client leaves
      es.submit(new CoordinateOutputter(s));
    }
  }
}





I have put sockets here since they are easier to get started with, but once you have this working well and want to boost your performance you will probably want to investigate the java.nio.channels package.

There's a good tutorial over at IBM.





-
转载请注明,
原文出处: http://lixh1986.iteye.com/blog/2348001









-
  • 大小: 2.5 KB
  • 大小: 39.4 KB
分享到:
评论

相关推荐

    基于java socket网络编程实现的简单模拟qq聊天的程序,可实现并发聊天

    Java Socket网络编程是Java语言中实现网络通信的基础,它提供了低级别的、面向连接的、...而本示例中的简单QQ聊天程序,主要是为了演示Java Socket的基本使用和并发处理,帮助初学者理解网络编程的基本概念和操作流程。

    Java聊天室程序,socket编程

    - 为了让用户友好地交互,聊天程序通常会有一个图形用户界面(GUI),可能使用Java的Swing或JavaFX库来实现。用户可以通过GUI输入消息并查看其他人的聊天记录。 通过以上步骤,一个基本的Java聊天室程序就可以构建...

    Java版socket编程实现带语音聊天和文件传送功能

    本资源是本人前面发过的一个局域网聊天工具的升级版。...代码保证可用,如有问题请留言,代码较规范,结构清晰,相信对学习java socket编程和swing界面开发的朋友有一定的帮助。 注:main函数在MainFrame类

    java实现socket编程网络通信多人聊天室

    通过以上步骤,一个简单的Java Socket编程实现的多人聊天室就搭建完成了。这样的系统适合初学者用来学习网络通信的基础知识,包括TCP连接、多线程编程、数据的序列化与反序列化等。通过实际操作,可以帮助理解网络...

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

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

    Java版socket编程实现带语音聊天和文件传送功能的局域网聊天工具

    本资源是本人前面发过的一个局域网聊天工具的升级版。...代码保证可用,如有问题请留言,代码较规范,结构清晰,相信对学习java socket编程和swing界面开发的朋友有一定的帮助。 注:main函数在MainFrame类

    Java基于socket的进程间通信 聊天小程序

    6. **输入/输出流**: 在Java的Socket编程中,数据通过输入流和输出流进行读写。ServerSocket和Socket都有相关的输入流和输出流对象,例如InputStream和OutputStream,用于接收和发送数据。 7. **聊天小程序设计**: ...

    EasyChat ,Java Socket编程,简易聊天程序

    聊天程序 JavaSocket编程,类似QQ的聊天程序(注册、登陆、聊天等) 1、界面模仿QQ界面,能够发起一对一聊天、接受聊天请求; 2、能够以当前日期和时间(精确到分)命名的文件来保持聊天记录; 3、能够调出聊天记录...

    基于Java Socket编程的局域网聊天程序源代码

    在这个“基于Java Socket编程的局域网聊天程序源代码”项目中,我们可以学习到如何构建一个简单的聊天应用程序,使得在同一局域网内的用户可以相互通信。以下是关于Java Socket编程的一些核心知识点和在该源代码中...

    Java Socket实现简单的聊天程序

    Java Socket实现的简易聊天程序是Java网络编程中的基础应用,主要涉及了客户端(Client)与服务器端(Server)之间的通信。在这个程序中,Socket作为Java提供的API,扮演着连接两端的关键角色,允许双方进行双向数据...

    有关socket的编程代码(简单的聊天程序).rar_Socket编程 聊天_java socket 聊天

    这个简单的聊天程序是一个很好的起点,可以帮助初学者理解Socket编程的基本原理和操作。在深入学习时,还可以探索更多高级特性,如错误处理、心跳机制、加密通信等,以及更复杂的网络应用程序设计。 文件"有关...

    socket编程 简单聊天程序

    在这个“简单聊天程序”中,我们将探讨如何使用Socket来构建一个基本的聊天应用,让两个用户可以通过互联网进行实时交流。 首先,我们需要理解什么是Socket。Socket是网络编程中的一个抽象概念,可以看作是两台...

    使用java语言编写的聊天程序Socket编程

    Java语言中的Socket编程是网络通信的核心技术之一,它允许两个应用程序通过网络进行数据交换。在本教程中,我们将深入探讨如何使用Java实现一个简单的聊天程序,重点在于多线程的应用。 首先,Socket是TCP/IP协议栈...

    局域网聊天 socket编程 java源程序

    本文将深入探讨“局域网聊天 socket编程 java源程序”的主题,解析其背后的技术细节和实现原理。 首先,让我们理解“局域网聊天”这个概念。局域网(LAN,Local Area Network)是指在有限地理范围内的计算机网络,...

    Java Socket 聊天程序(图形界面)

    实现Java Socket聊天多线程编程,图形化界面,多人聊天(群聊),私人聊天,是基于本地模拟的Java聊天程序。 Java Socket聊天程序是我用了三天的时间写出来,用Netbeans建的工程,图形化界面是Netbeans拖拉出来的,...

    基于socket编程题的java聊天程序

    Java聊天程序是网络编程中的一个经典案例,它利用Socket编程技术实现客户端和服务端之间的通信。在Java中,Socket是TCP/IP协议的应用层接口,用于在两台计算机之间建立可靠的、基于字节流的连接。本项目旨在教授如何...

    java中socket在线编程聊天系统的小案例

    在这个“java中socket在线编程聊天系统的小案例”中,我们将会探索如何构建一个简单的基于Socket的聊天应用程序。这个案例适用于初学者,可以帮助他们理解Socket编程的基本原理和应用。 首先,Socket在Java中扮演着...

    Java版socket编程 局域网聊天工具

    Java版的Socket编程是网络通信的核心技术之一,尤其在构建局域网聊天工具时尤为重要。本项目通过Java实现了一个功能丰富的即时通讯应用,包括全新界面风格、文字聊天、文件传输、窗口抖动以及语音聊天等功能。 1. *...

    java socket聊天程序,有界面

    Java Socket聊天程序是一种基于网络通信的软件应用,它利用了Java的Socket API来实现客户端与服务器之间的实时交互。在这个程序中,"有界面"意味着它不仅包含后台的网络通信逻辑,还具有用户友好的图形用户界面(GUI...

    Java TCP IP Socket编程(原书第2版)

    书中提供了多个实用的案例,如简单的聊天室应用、文件传输服务等,这些案例不仅展示了Socket编程的基本原理,也涵盖了多线程、非阻塞I/O和安全通信等高级主题。通过动手实践,读者可以将理论知识转化为实际技能,更...

Global site tag (gtag.js) - Google Analytics