Java实现TCP聊天问题,新手求教,谢谢

java_DJ2008 2008-07-21 09:33:21

初学程序,自己学着做个基于TCP的Chatroom,就是实现简单的收发字符串,GUI还没写。
发现好些问题,都是些菜鸟级问题,请各位不吝赐教。谢谢

Server和Client端的源码,分别贴在楼下。
...全文
241 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
AC903919 2010-09-14
  • 打赏
  • 举报
回复
你这种问法,看问题的人很辛苦的~
首先你要说清楚,你想实现什么~
然后再看,你是想要思路还是代码~
一上来就贴代码,昏~,看得人不高兴啦~
cengshilieren 2010-09-14
  • 打赏
  • 举报
回复
刚学习Java不懂,帮顶就是了
java_DJ2008 2008-07-25
  • 打赏
  • 举报
回复
还是没人能帮我看看吗?自己顶!
java_DJ2008 2008-07-24
  • 打赏
  • 举报
回复
Client端



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

public class C {
Socket Cs;
//拿到Mainframe的引用
Mainframe Mf;

public static void main(String[] args) {

C c = new C();
c.connect();
c.initframe();
}

//建立CS连接,在此Socket上,往外写一个字符串,同时接收服务器端字符串
void connect() {
try {
Cs = new Socket("127.0.0.1", 8888);
//test print
OutputStream Os = Cs.getOutputStream();
DataOutputStream Dos = new DataOutputStream(Os);
Dos.writeUTF("asda");
this.ReceiveFromServer();

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
//接收服务器端的字符串,死循环接收
void ReceiveFromServer() {
InputStream Cis;
DataInputStream Cdis;
while (true) {
try {
Cis = Cs.getInputStream();
Cdis = new DataInputStream(Cis);
System.out.println(Cdis.readUTF());
} catch (IOException e) {
e.printStackTrace();
}

}

}

//运行可视化界面
void initframe(){
Mf = new Mainframe();
Mf.LaunchFrame();
}



//GUi的具体类

class Mainframe {

Frame LaunchFrame(){
Frame f =new Frame();
f.setSize(300,200);
f.setVisible(true);
Button b = new Button("提交");
f.add(b);
f.repaint();
return f;
}


}
}
java_DJ2008 2008-07-24
  • 打赏
  • 举报
回复
恩,楼上说的是,应该写些注释的。重发


Server





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

public class S {

Socket Sc = null;

ReceiveAndSendtoClient Rastc = null;

//集合,用来存放线程类
List<ReceiveAndSendtoClient> Thclients = new ArrayList<ReceiveAndSendtoClient>();

public static void main(String[] args) {
//调用Connect方法。
(new S()).Connect();

}

//建立本身服务器端连接,建立死循环不断接收客户端连接,
//每个客户端实现不断接收字符串,所以再有一个死循环,不断接收,
//为了实现多个客户端连接,采用线程
void Connect() {
try {
ServerSocket Ss = new ServerSocket(8888);
while (true) {
Sc = Ss.accept();
System.out.println("A client connected.");
Rastc = new ReceiveAndSendtoClient();

new Thread(Rastc).start();
Thclients.add(Rastc);
}
} catch (IOException e) {
e.printStackTrace();
}

}

//具体的线程类,
class ReceiveAndSendtoClient implements Runnable {

InputStream Is;
DataInputStream Dis;
OutputStream Sos;
DataOutputStream Dsos;
public void run() {

//不断循环接收字符串,且在接收的时候,将目前接收到的信息发送给每一个连接上来的客户段的Socket
//就是每一个连接上来的线程
try {

Is = Sc.getInputStream();
Dis = new DataInputStream(Is);

while (true) {
//接收客户端字符串
//向每个客户端发送字符串
for (int i = 0; i < Thclients.size(); i++) {

System.out.println(i);
Thclients.get(i).send();
}
}
} catch (IOException e) {
e.printStackTrace();
}

}

//send方法,发送字符串
void send() {
try {
Sos = Sc.getOutputStream();
Dsos = new DataOutputStream(Sos);
Dsos.writeUTF(Dis.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}

}

}
youjianbo_han_87 2008-07-22
  • 打赏
  • 举报
回复
我有个java聊天的源代码和打包好的可执行文件,代码文件稍微多点,不好在这里贴出來,楼主要的话到我的资源里面去,名字交java 聊天程序,还有个java飞鸽传书聊天的例子
sd5711584 2008-07-22
  • 打赏
  • 举报
回复
麻烦搞点注释啊
java_DJ2008 2008-07-21
  • 打赏
  • 举报
回复
相关问题:
1:目前的程序可以实现客户端的连接,可以实现第一个Client的正常连接。在第一个Client里能收到Client发送的字符串。但是后来的就不行了。尝试在Send方法中打印i值,结果只是第一个Client时出来一个0,后续就不打印了....
怀疑是Send方法,但是没看出来问题

2:Server端的InputStream是定义在While(true)里好,还是在外面好,由什么区别吗?不太清楚,请赐教

3:在做这个类(List <ReceiveAndSendtoClient> Thclients = new ArrayList <ReceiveAndSendtoClient>(); )的集合的时候,发现如果写成
list Al =new ArrayList();
Al.add(new ReceiveAndSendtoClient());
结果我在Al.get()方法中只能取到Object类的方法,可是我想取的是Send方法,请问错在哪了?


4:最弱的一个问题:

我在client里写有一句//(new Mainframe()).LaunchFrame();
但是为什么编译出错呢?提示NO enlosing instance of type c ...
内部类不可以直接在main里做对象?


java_DJ2008 2008-07-21
  • 打赏
  • 举报
回复
Client端:

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

public class C {
Socket Cs;

public static void main(String[] args) {

(new C()).connect();
//(new Mainframe()).LaunchFrame();

}

void connect() {
try {
Cs = new Socket("127.0.0.1", 8888);
//test print
OutputStream Os = Cs.getOutputStream();
DataOutputStream Dos = new DataOutputStream(Os);
Dos.writeUTF("asda");
this.ReceiveFromServer();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}

void ReceiveFromServer() {
InputStream Cis;
DataInputStream Cdis;
while (true) {
try {
Cis = Cs.getInputStream();
Cdis = new DataInputStream(Cis);
System.out.println(Cdis.readUTF());
} catch (IOException e) {
e.printStackTrace();
}

}

}

class Mainframe {

void LaunchFrame(){
Frame f =new Frame();
f.setSize(300,200);
f.setVisible(true);
Button b = new Button("提交");
f.add(b);
}


}
}
java_DJ2008 2008-07-21
  • 打赏
  • 举报
回复
Server端:

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

public class S {

Socket Sc = null;

ReceiveAndSendtoClient Rastc = null;

List<ReceiveAndSendtoClient> Thclients = new ArrayList<ReceiveAndSendtoClient>();

public static void main(String[] args) {

(new S()).Connect();

}

void Connect() {
try {
ServerSocket Ss = new ServerSocket(8888);
while (true) {
Sc = Ss.accept();
System.out.println("A client connected.");
Rastc = new ReceiveAndSendtoClient();
Thclients.add(Rastc);
new Thread(Rastc).start();

}
} catch (IOException e) {
e.printStackTrace();
}

}

class ReceiveAndSendtoClient implements Runnable {

InputStream Is;
DataInputStream Dis;

public void run() {

while (true) {
try {
//接收客户端字符串
Is = Sc.getInputStream();
Dis = new DataInputStream(Is);
//向每个客户端发送字符串
for (int i = 0; i < Thclients.size(); i++) {
Thclients.get(i).send();
System.out.println(i);
}
} catch (IOException e) {
e.printStackTrace();
}

}

}

void send() {
OutputStream Sos;
try {
Sos = Sc.getOutputStream();
DataOutputStream Dsos = new DataOutputStream(Sos);
Dsos.writeUTF(Dis.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}

}

}

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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