socket如何实现多人聊天

oceans0501 2008-06-26 09:05:00
我写的一个server 一个client ,就是实现运行多个client,在一个client输入消息,然后消息发给服务器,服务器再回发给所有的client 代码如下,怎么实现不了呢,希望高手帮忙
server

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

public class ServerSocketDemo
{
public static void main(String[] args) throws Exception
{
ArrayList list=new ArrayList();
ServerSocket ss=new ServerSocket(8189);

while(true)
{
Socket s=ss.accept();
list.add(s);
new ReverseDemo(s,list);
}
// ss.close();
}
}
class ReverseDemo extends Thread
{
BufferedReader in=null;
PrintWriter out=null;
String str="abc";
ArrayList list;
Socket s;

public ReverseDemo(Socket s,ArrayList list)
{
this.list=list;
this.s=s;
this.start();
}
public void run()
{

try
{
InputStream inStream = s.getInputStream();
OutputStream outStream = s.getOutputStream();
Scanner in = new Scanner(inStream);

PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);
System.out.println(s.getInetAddress().getHostAddress()+" connected-------");
out.println("连接成功!");
Scanner a=new Scanner(System.in);

while(true)
{

str=in.nextLine();
// StringBuffer sb=new StringBuffer(str);
// str=sb.reverse().toString();
//System.out.println(str);
Iterator iterator=list.iterator();
while(iterator.hasNext())
{
PrintWriter o=new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
((Socket)(iterator.next())).getOutputStream())),true);
o.println(str);
}

}
// in.close();
// out.close();
// s.close();
}
catch (Exception ex)
{
ex.printStackTrace();
}

}
}

client

/**
@version 1.20 2004-08-03
@author Cay Horstmann
*/

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

/**
This program makes a socket connection to the atomic clock
in Boulder, Colorado, and prints the time that the
server sends.
*/
public class SocketTest
{
public static void main(String[] args)
{
try
{
Socket s = new Socket("localhost", 8189);
try
{
InputStream inStream = s.getInputStream();
OutputStream outStream=s.getOutputStream();
Scanner in = new Scanner(inStream);
Scanner a=new Scanner(System.in);


PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);

boolean done=false;
while (!done)
{

String line = in.nextLine();
System.out.println("服务器发送的信息为:"+line);

if(a.hasNextLine())
{
String b=a.nextLine();
out.println(b);
if (b.trim().equals("BYE"))
done = true;

}
//else continue;
}
}
finally
{
s.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
...全文
816 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
刘彬彬 2008-06-26
  • 打赏
  • 举报
回复
这样的东西,网上一大把。
不过强烈建议,LZ多看看马老师的 “基于SOCKET的聊天室的实现”。
ochinchina 2008-06-26
  • 打赏
  • 举报
回复
一个简单的聊天程序

==========================================================================================
server:

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

public class ServerSocketDemo
{

public static void main(String[] args)
{
ArrayList list = new ArrayList();
ServerSocket ss = null;

try {
ss =new ServerSocket(8189);

while(true)
{
Socket s=ss.accept();
list.add(s);
new ReverseDemo(s,list);
}
}catch( Exception ex ) {
}
try {
ss.close();
}catch( Exception ex ) {
}
}
}

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

public class ReverseDemo extends Thread
{
BufferedReader in=null;
PrintWriter out=null;
String str="abc";
ArrayList list;
Socket s;

public ReverseDemo(Socket s,ArrayList list)
{
this.list=list;
this.s=s;
this.start();
}
public void run()
{

try
{
InputStream inStream = s.getInputStream();
OutputStream outStream = s.getOutputStream();

PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);
System.out.println(s.getInetAddress().getHostAddress()+" connected-------");
out.println("连接成功!");

byte[] buf = new byte[1024];

while(true)
{
int bytes_read = inStream.read( buf );
if( bytes_read < 0 ) {
break;
} else {
broadcast( buf, 0, bytes_read );
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally {
list.remove( s );
}
}


void broadcast( byte[] b, int offset, int length ) {
for( int i = 0, n = list.size(); i < n; i++ ) {
Socket sock = (Socket) list.get( i );
if( sock != s ) {
try {
sock.getOutputStream().write( b, offset, length );
sock.getOutputStream().flush();
}catch( Exception ex ) {
}
}
}
}
}

===================================================================================
client:


/**
@version 1.20 2004-08-03
@author Cay Horstmann
*/

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

/**
This program makes a socket connection to the atomic clock
in Boulder, Colorado, and prints the time that the
server sends.
*/
public class SocketTest
{
private Socket sock_;
private byte[] name_;

public SocketTest( String host, int port, byte[] name ) throws Exception {
name_ = name;
sock_ = new Socket( host, port );
Thread th = new Thread( createMsgRecvRunnable() );
th.start();
byte[] b = new byte[ 1024 ];

int bytes_read = readMsg( b );
while( bytes_read > 0 ) {
sendMsg( b, 0, bytes_read );
bytes_read = readMsg( b );
}
}

private Runnable createMsgRecvRunnable() {
return new Runnable() {
public void run() {
try {
InputStream in = sock_.getInputStream();
byte[] buf = new byte[1024];

while( true ) {
int bytes_read = in.read( buf );
if( bytes_read < 0 ) {
break;
} else {
System.out.write( buf, 0, bytes_read );
}
}
}catch( Exception ex ) {
}
}
};
}

private int readMsg( byte[] b ) throws Exception {
return System.in.read( b );
}

private void sendMsg( byte[] msg, int offset, int length ) throws Exception {
sock_.getOutputStream().write( name_ );
sock_.getOutputStream().write( msg, offset, length );
sock_.getOutputStream().flush();
}

public static void main( String[] args ) {
try {
String name = null;

if( args.length > 0 ) {
name = args[0] + ":";
} else {
name = "unknown:";
}
SocketTest test = new SocketTest( "localhost", 8189, name.getBytes() );
}catch( Exception ex ) {
ex.printStackTrace();
}
}

}
ochinchina 2008-06-26
  • 打赏
  • 举报
回复
一个简单的聊天程序
=====================================================================================================
server:

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

public class ServerSocketDemo
{

public static void main(String[] args)
{
ArrayList list = new ArrayList();
ServerSocket ss = null;

try {
ss =new ServerSocket(8189);

while(true)
{
Socket s=ss.accept();
list.add(s);
new ReverseDemo(s,list);
}
}catch( Exception ex ) {
}
try {
ss.close();
}catch( Exception ex ) {
}
}
}


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

public class ReverseDemo extends Thread
{
BufferedReader in=null;
PrintWriter out=null;
String str="abc";
ArrayList list;
Socket s;

public ReverseDemo(Socket s,ArrayList list)
{
this.list=list;
this.s=s;
this.start();
}
public void run()
{

try
{
InputStream inStream = s.getInputStream();
OutputStream outStream = s.getOutputStream();

PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);
System.out.println(s.getInetAddress().getHostAddress()+" connected-------");
out.println("连接成功!");

byte[] buf = new byte[1024];

while(true)
{
int bytes_read = inStream.read( buf );
if( bytes_read < 0 ) {
break;
} else {
broadcast( buf, 0, bytes_read );
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally {
list.remove( s );
}
}


void broadcast( byte[] b, int offset, int length ) {
for( int i = 0, n = list.size(); i < n; i++ ) {
Socket sock = (Socket) list.get( i );
if( sock != s ) {
try {
sock.getOutputStream().write( b, offset, length );
sock.getOutputStream().flush();
}catch( Exception ex ) {
}
}
}
}
}

======================================================================================================
client


/**
@version 1.20 2004-08-03
@author Cay Horstmann
*/

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

/**
This program makes a socket connection to the atomic clock
in Boulder, Colorado, and prints the time that the
server sends.
*/
public class SocketTest
{
private Socket sock_;
private byte[] name_;

public SocketTest( String host, int port, byte[] name ) throws Exception {
name_ = name;
sock_ = new Socket( host, port );
Thread th = new Thread( createMsgRecvRunnable() );
th.start();
byte[] b = new byte[ 1024 ];

int bytes_read = readMsg( b );
while( bytes_read > 0 ) {
sendMsg( b, 0, bytes_read );
bytes_read = readMsg( b );
}
}

private Runnable createMsgRecvRunnable() {
return new Runnable() {
public void run() {
try {
InputStream in = sock_.getInputStream();
byte[] buf = new byte[1024];

while( true ) {
int bytes_read = in.read( buf );
if( bytes_read < 0 ) {
break;
} else {
System.out.write( buf, 0, bytes_read );
}
}
}catch( Exception ex ) {
}
}
};
}

private int readMsg( byte[] b ) throws Exception {
return System.in.read( b );
}

private void sendMsg( byte[] msg, int offset, int length ) throws Exception {
sock_.getOutputStream().write( name_ );
sock_.getOutputStream().write( msg, offset, length );
sock_.getOutputStream().flush();
}

public static void main( String[] args ) {
try {
String name = null;

if( args.length > 0 ) {
name = args[0] + ":";
} else {
name = "unknown:";
}
SocketTest test = new SocketTest( "localhost", 8189, name.getBytes() );
}catch( Exception ex ) {
ex.printStackTrace();
}
}

}
oceans0501 2008-06-26
  • 打赏
  • 举报
回复
已经用到多线程了,现在可以实现和服务器的聊天,但是当在一个客户端输入内容以后无法在另一个客户端实时的显示出来,需要在另一个客户端输入内容后才能显示
lzx6169936 2008-06-26
  • 打赏
  • 举报
回复
肯定的用多线程啊每增加一个客户端多开一个线程
甲壳虫 2008-06-26
  • 打赏
  • 举报
回复
你在程序里应该有用到多线程了,如果可以实现单个客户和服务器进行聊天,那么多开几个客户端,我想也可以进行多客户端和服务器进行聊天了。
  • 打赏
  • 举报
回复
开多个命令行
oceans0501 2008-06-26
  • 打赏
  • 举报
回复
是在命令行下运行的,能实现我说的功能就可以了
oceans0501 2008-06-26
  • 打赏
  • 举报
回复
谢谢八楼,已经搞定了
goosman 2008-06-26
  • 打赏
  • 举报
回复
建一个类来封装连接上的客户端的信息,某客户端发一个消息的时候,把这些消息发送到我们的客户端集合中每一个客户端就可以了.
冰思雨 2008-06-26
  • 打赏
  • 举报
回复
我写了一个简单的控制台聊天室程序.楼主有兴趣,可以看看.
服务端:
package houlei.chatRoom;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Iterator;
import java.util.Vector;

public class Server implements Runnable {
private Thread instance;
private boolean running=false;
private Socket socket;
private Vector set;
public Server(Socket socket, Vector set) {
this.socket=socket;this.set=set;
}

public void run() {
while(running){
try {
InputStream in = socket.getInputStream();
if(in.available()>0){
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = br.readLine();
Iterator itr = set.iterator();
while(itr.hasNext()){
Server s = (Server)itr.next();
if(this.equals(s)==false)
s.sendLine(line);
}
}
Thread.sleep(10);
} catch (IOException e) {
stop();
} catch (InterruptedException e) {
}
}
}

private void sendLine(String line) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write(line);
bw.newLine();
bw.flush();
}

public static void main(String[] args) throws IOException {
int port = 8189;
ServerSocket ss = new ServerSocket(port);
Vector set = new Vector();
while(true){
Server s = new Server(ss.accept(),set);
set.add(s);
s.start();
}
}

private void start() {
if(running)return;
running=true;
instance=new Thread(this);
instance.start();
}

private void stop(){
if(running){
running=false;
set.remove(this);
if(socket!=null && socket.isConnected()){
try {
socket.close();
} catch (IOException e) {
}
}
instance.interrupt();
}
}
}

客户端:
package houlei.chatRoom;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class Client {

public static void main(String[] args) throws Exception {
String serverIp = "127.0.0.1";
int serverPort = 8189;
Socket s = new Socket(serverIp,serverPort);
InputStream input = s.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
InputStream in = System.in;
while(s.isConnected()){
if(in.available()>0){
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = br.readLine();
writer.write(line);
writer.newLine();
writer.flush();
}
if(input.available()>0){
String line = reader.readLine();
System.out.println(line);
}
Thread.sleep(10);
}
}

}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧