FTP与多线程

kkkdaxia 2012-07-23 02:50:20
我现在做的sever端可以和一个client端进行连接了,但是两个client就不行了,我最终想要做的就是client和sever之间能够互相发送字符。本人初学者,最近看了多线程,就是run();thread,但是不知道如何具体操作。希望大神指导!
注:我仅仅想sever和client互相能够发送字符就可以,不用上传下载东西。
...全文
189 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkkdaxia 2012-07-26
  • 打赏
  • 举报
回复
搜噶,长见识了,谢谢
MiceRice 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
哦。。死循环?line = br.readLine()按行读取,总会有读完的一天,读完了循环结束了try不就也结束了么?

还有说,这个System.out.println("DISCONNECT " + client.getRemoteSocketAddress() + ":" + client.getPort());直接放在catch里面不是更好?
[/Quote]

你这个是网络IO,只要流没有被close(),这个循环就不会结束。
死循环是个比喻了;只要循环结束,finally就会被执行。


第二个说法不合适,循环是可以正常结束的(流被close),并非一定要抛出异常的,也就是不会走catch块;那么你这个信息就显示不出来了。
kkkdaxia 2012-07-26
  • 打赏
  • 举报
回复
哦。。死循环?line = br.readLine()按行读取,总会有读完的一天,读完了循环结束了try不就也结束了么?

还有说,这个System.out.println("DISCONNECT " + client.getRemoteSocketAddress() + ":" + client.getPort());直接放在catch里面不是更好?
MiceRice 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
我想问一下,异常捕捉里面的finally 后那段语句的作用是什么?finally 后不是加必须要执行的语句吗?怎么没看到有执行
[/Quote]
当然会执行,但是你要给他执行的机会,你前面while基本是个死循环,要循环结束才能执行了。


[Quote=引用 9 楼 的回复:]
还有,,为什么“”不能放在循环中?
[/Quote]
漏了内容,应该是:
“java.net.ServerSocket server = new java.net.ServerSocket(8000);”不能放在循环中。

因为这相当于每次循环都重新在8000端口上建立一个服务监听,这肯定就会造成冲突了。
kkkdaxia 2012-07-26
  • 打赏
  • 举报
回复
还有,,为什么“”不能放在循环中?
kkkdaxia 2012-07-26
  • 打赏
  • 举报
回复
我想问一下,异常捕捉里面的finally 后那段语句的作用是什么?finally 后不是加必须要执行的语句吗?怎么没看到有执行
kkkdaxia 2012-07-26
  • 打赏
  • 举报
回复
可以了,谢谢你!
MiceRice 2012-07-23
  • 打赏
  • 举报
回复
你写的比较乱:
最大错误是“”不应该放入循环中;
第二大错误是catch中没有打印出异常信息。

整理如下:

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

public class TestServersession {

public static void main(String[] args) throws Exception {//Exception是自定义异常处理的类
//建立一个socket服务,其端口号是8000
ServerSocket server = new ServerSocket(8000);
System.out.println("STARTED: " + server);
while (true) {
Socket client = server.accept();
Thread waiter = new Thread(new MySocketWaiter(client));
waiter.start();
}
}
}

class MySocketWaiter implements Runnable {
private Socket client;

public MySocketWaiter(Socket client) {
this.client = client;
}

public void run() {
try {
//接收client的数据,作为一个输入数据,放在一个接收缓冲区里面,这个缓冲区叫br
BufferedReader br = new BufferedReader(new java.io.InputStreamReader(client.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
//输出br里的数据(客户端发来的数据)
System.out.println("RECEIVE[" + client.getRemoteSocketAddress() + ":" + client.getPort() + "]" + line);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
System.out.println("DISCONNECT " + client.getRemoteSocketAddress() + ":" + client.getPort());
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
kkkdaxia 2012-07-23
  • 打赏
  • 举报
回复
我以前都用c#/JS/html编程的,最近才开始学java,所以语法上有点小白,不过逻辑和思路大概能明白。
public class TestServersession{
static class MySocketWaiter implements Runnable {
private java.net.Socket client;
public MySocketWaiter(java.net.Socket client) {
this.client = client;
}
public void run() {
try{
java.io.BufferedReader br= new java.io.BufferedReader(
new java.io.InputStreamReader(client.getInputStream()));
//接收client的数据,作为一个输入数据,放在一个接收缓冲区里面,这个缓冲区叫br
java.io.PrintWriter out = new java.io.PrintWriter(
new java.io.BufferedWriter(
new java.io.OutputStreamWriter(client.getOutputStream())));
//输出数据,目标是client,由out这个写方法来输出
java.io.BufferedReader reader = new java.io.BufferedReader(
new java.io.InputStreamReader(System.in));
//System.in表示输入字节流,以键盘为输入源。
//键盘输入的数据给字节输入流,然后给缓冲reader。
String line = null;
while ((line = br.readLine())!= null) {
//输出br里的数据(客户端发来的数据)
System.out.println(line);
//输出client端输入的数据
String s = reader.readLine();
//s是server端的输入数据
out.println("server say:"+s);
//输出server输入的数据
out.flush();
//把out的缓冲区数据强行输出给客户端
//out.close();
}
}catch(Exception ex)
{}
}
}
public static void main(String[] args) throws Exception{//Exception是自定义异常处理的类
//建立一个socket服务,其端口号是8000
//在你本机建立服务,即只要输入端口号就可以了
while (true) {

java.net.ServerSocket server = new java.net.ServerSocket(8000);
java.net.Socket client = server.accept();
System.out.println(server);
Thread waiter = new Thread(new MySocketWaiter(client));
waiter.start();}
}
}


我弄成这样,编译能通过,但是运行结果是错的,我进调试他直接跳到serversoket里面的IOException里了。。你看是不是有什么问题?麻烦麻烦。。。
MiceRice 2012-07-23
  • 打赏
  • 举报
回复
你的基础知识还真是匮乏啊。

IO类的很多函数是会抛出异常的,如果你不 try catch,就肯定是无法编译的,比如:

try {
while (true) {
java.net.Socket client = server.accept();
Thread waiter = new Thread(new MySocketWaiter(client));
waiter.start();
}
} catch(Exception ex) {
ex.printStackTrace();
}



另一种做法就是本函数不catch,而是直接继续往外抛异常,也就是 throws Exception 了。
kkkdaxia 2012-07-23
  • 打赏
  • 举报
回复
我修改了,但是总是出错误, throws Exception这句话不是用于错误时抛出吗?为什么不加以后IO都没法用了,还有,这句话一开始是加在main函数里的,现在如果我把那些文件流放在run()函数里的话 throws Exception在main 里就不起作用,放在其他函数实现的地方也放不了,还有,这几个函数的顺序是什么?
MiceRice 2012-07-23
  • 打赏
  • 举报
回复
主函数大致修改为:
public static void main(String[] args) throws Exception {
java.net.ServerSocket server = new java.net.ServerSocket(8000);
while (true) {
java.net.Socket client = server.accept();
Thread waiter = new Thread(new MySocketWaiter(client));
waiter.start();
}
}


然后增加个MySocketWaiter专门负责处理具体IO工作:
class MySocketWaiter extends Runnable {
private Socket client;
public MySocketWaiter(Socket client) {
this.client = client;
}
public void run() {
...
}
}
kkkdaxia 2012-07-23
  • 打赏
  • 举报
回复
嗯。就是这个意思,就是怎样在server端建立这种多线程。
仅仅想发送字符是我不想传文件之类的- -弄的简单好理解一些。
public static void main(String[] args) throws Exception {
java.net.ServerSocket server = new java.net.ServerSocket(8000);
java.net.Socket client = server.accept();
java.io.BufferedReader br= new java.io.BufferedReader(
new java.io.InputStreamReader(client.getInputStream()));
java.io.PrintWriter out = new java.io.PrintWriter(
new java.io.BufferedWriter(
new java.io.OutputStreamWriter(client.getOutputStream())));
java.io.BufferedReader reader = new java.io.BufferedReader(
new java.io.InputStreamReader(System.in));
String line = null;
}
我服务端就这点东西= =,可以实现与单个客户端通信,咋弄成多线程的?
MiceRice 2012-07-23
  • 打赏
  • 举报
回复
你的问题有点逻辑上混淆。这发送字符跟FTP有啥关系啊?!

你说:sever端可以和一个client端进行连接了
然后又说:两个client就不行了
然后说:仅仅想sever和client互相能够发送字符就可以

是不是说可以实现 单个Client 和 Server 之间互相发送字符;但同时两个Client连接上Server就不行?


如果是这样,说明你Server没有用多线程来实现,应该每隔Client有一条独立线程负责通讯服务。

另一种方案是NIO,这个较为复杂,建议你先不考虑。

50,538

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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