一个很难的Socket问题求解 http://download.csdn.net/detail/longyangyangyang/4442165 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有用哦,是要连续通话,多线程貌似还会读写阻塞。例如:服务端:import java.io.*;import java.net.*;import java.util.*;public class InteractiveServer { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { ServerSocket server=new ServerSocket(7809); Socket socket; PrintWriter print; Scanner scan; while(true) { socket=server.accept(); System.out.println("服务器收到"); scan=new Scanner(socket.getInputStream()); if(scan.hasNext()){System.out.println("服务器收到信息是:"+scan.next());} scan.close(); System.out.println("服务器开始返回信息···"); print=new PrintWriter(socket.getOutputStream()); print.println("ok"); print.flush(); print.close(); socket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}客户端:import java.net.*;import java.io.*;import java.util.*;public class IteractiveClient { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Socket soc = null; PrintWriter print = null; try { soc=new Socket("localhost",7809); System.out.println("客户端建立连接"); print=new PrintWriter(soc.getOutputStream()); Thread t1=new Thread(new OutThread(print)); t1.start(); Thread t2=new Thread(new InThread(soc)); t2.start(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}class OutThread implements Runnable { PrintWriter out; public OutThread(PrintWriter out) { this.out=out; } public void run() { System.out.println("客户端发送J2EE到服务器:"); out.print("j2ee"); out.flush(); } }class InThread implements Runnable { Socket soc; Scanner in = null; public InThread(Socket soc) { this.soc=soc; } public void run() { try { in=new Scanner(soc.getInputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { Thread.sleep(4000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("客户端接收:"); if(in.hasNext()) { System.out.println(in.next()); } else{System.out.println("服务器无返回");} in.close(); try { soc.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }--------------------------------------------------------------------------------阻塞了··· 不知道你要表达什么意思InputStream当然是阻塞的了,不阻塞那你让他读什么东西?这和连续传送数据并没有冲突一边写另一边读,有什么问题那? 老生长谈的问题。要达到你的效果,客户端和服务端分别要有两个socket,一个负责写,一个负责读。不能在一个socket既读又写的,因为会阻塞。 这个就是我的问题,其实我是最想问是否可以在同一个socket实现无阻塞。能不能控制时间片来达到无阻塞效果,而不是采用两个socket?或者运用线程优先级?真的没办法解决么? 我要表达的是:在服务器端和客户端都在一个socket既读又写,而又不形成阻塞。有没有解决这个问题的办法? 哥们,要达到通话效果需要将对数据流的操作封装在一个while循环里使得服务器发出流数据后刷新流,再重新处理输入流,显示客户反馈的数据;客户端处理输出流后及时刷新,再处理输入流。你客户端没有采用循环处理,因此只能通话一次,不能实现连续通话。具体代码不用说了吧,修改一下客户端就行了。 实际上,我测试过很多次,客户端也使用过你说的while循环,甚至使用过多线程不同步···结果仍令人失望。出现的都是我在10楼说的问题。(现在解决了问题,可是我用了两个serverSocket,用数据集把他们连接起来了)我试试nio,行的话我把代码贴出来,让大家明白我的意思,也解决以后看到这个问题的同学~ 在一条socket上是可以达到通话的效果的,做成长连接形式即可。服务器和客户端各开两个线程,分别负责读和写,但这样还不够,必须定义数据包结构,也就是要告诉对方什么时候可以不必读数据了,本次消息已经发送完毕,数据包结构很重要,不然会一直阻塞读取 tcp是双工的,跟几个socket没有关系,关键是底层链路负载状况如果链路超载,再开多少个socket都是徒然 咳! 弱弱的补充一句: 服务端InputStream和OutputSteam的话,客户端应该是OutputSteam和InputSteam吧?服务端和客户端同事getInputSteam,我觉得肯定阻塞啊? 得一个写,一个读,不能两个都读吧? 关于Java的线程。 我的这个简单的算法错在哪呀?再简单不过的代码了 我真笨 Tomcat6.0 中的admin没有了,到哪里可以下载? struts1.1的问题 问个很弱智的问题?JSP是不是真的不能用? 初用DOM4J,请教一个问题 可不可以这样说:Hibernate封装了JDBC,Spring封装了Hibernate? 500分征求用web service 代码, 不够可以再加。 关于在struts中使用的页面验证 熟悉JBOSS的请进,高分送上 如何避免在for循环中对数据库操作? mayaa框架 中 不可以 <m:if> 嵌套 <m:for> 吗?
服务端:
import java.io.*;
import java.net.*;
import java.util.*;public class InteractiveServer
{ /**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
try {
ServerSocket server=new ServerSocket(7809);
Socket socket;
PrintWriter print;
Scanner scan;
while(true)
{
socket=server.accept();
System.out.println("服务器收到");
scan=new Scanner(socket.getInputStream());
if(scan.hasNext()){System.out.println("服务器收到信息是:"+scan.next());}
scan.close();
System.out.println("服务器开始返回信息···");
print=new PrintWriter(socket.getOutputStream());
print.println("ok");
print.flush();
print.close();
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}客户端:
import java.net.*;
import java.io.*;
import java.util.*;public class IteractiveClient
{ /**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Socket soc = null;
PrintWriter print = null;
try {
soc=new Socket("localhost",7809);
System.out.println("客户端建立连接");
print=new PrintWriter(soc.getOutputStream());
Thread t1=new Thread(new OutThread(print));
t1.start();
Thread t2=new Thread(new InThread(soc));
t2.start();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
class OutThread implements Runnable
{
PrintWriter out;
public OutThread(PrintWriter out)
{
this.out=out;
}
public void run()
{
System.out.println("客户端发送J2EE到服务器:");
out.print("j2ee");
out.flush();
}
}class InThread implements Runnable
{
Socket soc;
Scanner in = null;
public InThread(Socket soc)
{
this.soc=soc;
}
public void run()
{
try {
in=new Scanner(soc.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("客户端接收:");
if(in.hasNext())
{
System.out.println(in.next());
}
else{System.out.println("服务器无返回");}
in.close();
try {
soc.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
--------------------------------------------------------------------------------
阻塞了···
InputStream当然是阻塞的了,不阻塞那你让他读什么东西?
这和连续传送数据并没有冲突
一边写另一边读,有什么问题那?
真的没办法解决么?
出现的都是我在10楼说的问题。(现在解决了问题,可是我用了两个serverSocket,用数据集把他们连接起来了)
我试试nio,行的话我把代码贴出来,让大家明白我的意思,也解决以后看到这个问题的同学~
如果链路超载,再开多少个socket都是徒然