Java 多线程和Socket

application123 2009-12-23 01:28:47
import java.net.*;
import java.io.*;

class Server
{
public static void main(String[] args)
{
MuiThread mt=new MuiThread();
new Thread(mt).start();
}
}

class MuiThread implements Runnable
{
ServerSocket ss;
Socket s;
InputStream is;
OutputStream os;
String str;

MuiThread()
{
ss=null;
s=null;
is=null;
os=null;
str=null;
}

public void run()
{
try
{
ss=new ServerSocket(5000);
while(true)
{
s=ss.accept();
is=s.getInputStream();
os=s.getOutputStream();
os.write("Welcome".getBytes());
byte[] b=new byte[100];
int len=is.read(b);
str=new String(b,0,len);
if (str.equals("e"))
{
os.write("the Server will close at once".getBytes());
System.out.println("Client is Disconnectiong");
}
else
{
System.out.println(str);
}
}
}
catch(Exception e)
{
System.out.println(e);
}
}
}

为什么这端程序只能有一个客户端连接??
谢谢
...全文
155 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bayougeng 2009-12-25
  • 打赏
  • 举报
回复
public class Client implements Runnable {

Socket socket;

public static void main(String[] arg) throws UnknownHostException{
Thread t = new Thread(new Client(InetAddress.getLocalHost(), 5000));
t.start();
}

public Client(InetAddress addr, int port){
try{
socket = new Socket(addr, 5000);
}catch(Exception e){
e.printStackTrace(System.err);
}
}

@Override
public void run() {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
try{
OutputStream os = socket.getOutputStream();
String temp = null;
while((temp = s.next()) != null){
os.write(temp.getBytes());
if("e".equals(temp)){
break;
}
}
os.close();
socket.close();
}catch(Exception e){
e.printStackTrace(System.err);
}

}
}

这是客户端的代码。
先运行服务器端,再运行客户端。
HappyKeKe 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bayougeng 的回复:]
引用 9 楼 happykeke 的回复:
我想问个很弱的问题 这个代码怎么执行 我摁F5没反应啊

这个是服务器端的代码。只是监听端口。没有请求就不会看到输出的。
[/Quote]

那要怎么看对不对啊
bayougeng 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 happykeke 的回复:]
我想问个很弱的问题 这个代码怎么执行 我摁F5没反应啊
[/Quote]
这个是服务器端的代码。只是监听端口。没有请求就不会看到输出的。
很久以前飞 2009-12-24
  • 打赏
  • 举报
回复
初学 学习学习
HappyKeKe 2009-12-24
  • 打赏
  • 举报
回复
我想问个很弱的问题 这个代码怎么执行 我摁F5没反应啊
duoduo_die 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bayougeng 的回复:]
你应该在while里创建一个新的线程与当前的socket对应。
创建新线程的时候,以socket作为参数。然后继续监听。
也就是说,你的这个主线程只负责分配线程与请求对应。只要有请求,就为它分配一个线程。
[/Quote]
8错 这个是逻辑的问题
application123 2009-12-23
  • 打赏
  • 举报
回复
多谢
wholesale3151 2009-12-23
  • 打赏
  • 举报
回复
class MuiThread implements Runnable
{
Serverchinese wholesalers ss;
Socket s;
InputStream is;
OutputStream os;
String str;
bayougeng 2009-12-23
  • 打赏
  • 举报
回复
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
public static void main(String[] args) throws IOException {

ServerSocket ss = new ServerSocket(5000);
while (true) {
MuiThread server = new MuiThread(ss.accept());
new Thread(server).start();
}
}
}

class MuiThread implements Runnable {
Socket socket;

MuiThread(Socket socket) {
this.socket = socket;
}

public void run() {
try {
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
os.write("Welcome".getBytes());
while (true) {
byte[] b = new byte[100];
int len = is.read(b);
String str = new String(b, 0, len);
if (str.equals("e")) {
os.write("the Server will close at once".getBytes());
System.out.println("Client is Disconnectiong");
break;
} else {
System.out.println(str);
}
}
is.close();
os.close();
socket.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
nickycheng 2009-12-23
  • 打赏
  • 举报
回复


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

class Server {

public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(5000);
while (true) {
Socket s = ss.accept();
MuiThread mt = new MuiThread(s);
new Thread(mt).start();
}
}
}

class MuiThread implements Runnable {

Socket s;

InputStream is;

OutputStream os;

String str;

MuiThread(Socket s) {
this.s = s;
is = null;
os = null;
str = null;
}

public void run() {
try {
is = s.getInputStream();
os = s.getOutputStream();
os.write("Welcome".getBytes());
byte[] b = new byte[100];
int len = is.read(b);
str = new String(b, 0, len);
if (str.equals("e")) {
os.write("the Server will close at once".getBytes());
System.out.println("Client is Disconnectiong");
} else {
System.out.println(str);
}
} catch (Exception e) {
System.out.println(e);
}
}
}

bayougeng 2009-12-23
  • 打赏
  • 举报
回复
你应该在while里创建一个新的线程与当前的socket对应。
创建新线程的时候,以socket作为参数。然后继续监听。
也就是说,你的这个主线程只负责分配线程与请求对应。只要有请求,就为它分配一个线程。
application123 2009-12-23
  • 打赏
  • 举报
回复
没有明白
nickycheng 2009-12-23
  • 打赏
  • 举报
回复
我想是因为端口 5000
不管多少个线程,你只能有一个服务线程可以绑定到5000上
发帖
Java

4.9w+

社区成员

Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
帖子事件
创建了帖子
2009-12-23 01:28
社区公告
暂无公告