下边的代码,如果我去掉红色部分,client端就能执行通过,只是不能所收到server的返回值,但是如果我加上红色部分,程序就卡死在那里了,请问,我如何才能既发送到服务器端,又能接收到服务器的返回信息呢?
void beginlogin()
{
String send_info=Main.sessionno.toString().trim()+","+Main.sessionpwd.toString().trim();
try{
link_server_ip=java.net.InetAddress.getByName("www.abc.net").getHostAddress().toString();
link_sa=new java.net.InetSocketAddress(link_server_ip,java.lang.Integer.parseInt(link_sports)); link_server.connect(link_sa);
link_sosw=new OutputStreamWriter(link_server.getOutputStream());
link_bwout=new BufferedWriter(link_sosw);
link_in=new BufferedReader(c_isr=new InputStreamReader(link_server.getInputStream()));
link_bwout.write(Main.flag.toString().trim()+","+Main.sessionno.toString().trim()+","+Main.sessionpwd.toString().trim());
link_bwout.flush();
String readstr=null;
while(true)
{
if((readstr=link_in.readLine())==null)
{
break;
}
else
{
jLabel1.setText((readstr=link_in.readLine()));
}
}
link_server.close();
}
catch(Exception e)
{
}
}
void beginlogin()
{
String send_info=Main.sessionno.toString().trim()+","+Main.sessionpwd.toString().trim();
try{
link_server_ip=java.net.InetAddress.getByName("www.abc.net").getHostAddress().toString();
link_sa=new java.net.InetSocketAddress(link_server_ip,java.lang.Integer.parseInt(link_sports)); link_server.connect(link_sa);
link_sosw=new OutputStreamWriter(link_server.getOutputStream());
link_bwout=new BufferedWriter(link_sosw);
link_in=new BufferedReader(c_isr=new InputStreamReader(link_server.getInputStream()));
link_bwout.write(Main.flag.toString().trim()+","+Main.sessionno.toString().trim()+","+Main.sessionpwd.toString().trim());
link_bwout.flush();
String readstr=null;
while(true)
{
if((readstr=link_in.readLine())==null)
{
break;
}
else
{
jLabel1.setText((readstr=link_in.readLine()));
}
}
link_server.close();
}
catch(Exception e)
{
}
}
解决方案 »
- 用ObjectInputStream读二进文件
- 新手菜鸟,问关于数组的问题
- 这样的异常。。。
- DataInputStream 问题?
- 面试问题(转贴)
- 接口interface和委托delegate的详细解释,最好能举例说明,我基本是一头雾水,不知道怎么广泛应用
- 如何写java的代码阅读技术报告?
- 在线等!急!(帮帮忙喔,简单问题)
- JDK设置环境变量的问题
- 请问如何打开.pdg格式文档???
- Hibernate+spring 连接多个数据库问题!在线急等!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- public static void exit(int status) status的数值,对退出有什么区别吗?
楼主【cqandy】截止到2008-07-28 03:21:23的历史汇总数据(不包括此帖):
发帖的总数量:14 发帖的总分数:450 每贴平均分数:32
回帖的总数量:13 得分贴总数量:1 回帖的得分率:7%
结贴的总数量:13 结贴的总分数:400
无满意结贴数:1 无满意结贴分:50
未结的帖子数:1 未结的总分数:50
结贴的百分比:92.86 % 结分的百分比:88.89 %
无满意结贴率:7.69 % 无满意结分率:12.50 %
值得尊敬
server收到然后再作为一个方法的参数,客户端再用流得到不就好了。
你可以换成按字节读取,或字符读取应该没有阻塞.
其次 , while循环,其循环条件尽量不要用常量true .
第三 , GUI编程,同时又涉及到IO操作的,一般要做成异步处理模式的.因为,void beginlogin() 这个方法,是图形绘制线程来调用的,所以,当你这个方法无法及时返回的情况下,用户的界面会处于僵死状态.
第四 , 楼主应该设计一个比较好的结构,将通讯,数据通道和图形显式分成三部分来完成,这样,结构清晰,也容易排错.当然,这就涉及到多线程了.
第五 , 按照我的设计思路,提一下我自己的看法,看看能否给楼主启示.A.设计两个队列,一个用于存放接收过来的数据,一个存放要发送的数据.可以使用collections.synchronizedList(new LinkedList);方法来创建.
B.设计一个接收队列的监听线程,查看接收队列中是否有数据,如果有,就调用图形界面的相关方法,将数据显式到图形界面,如果没有sleep上100毫秒继续查看.
C.将图形界面的发送代码做一下更改,发送方法(比如beginlogin()方法)只将数据放到发送队列,设置一些辅助的显式信息(如正在发送请等待之类的),就可以了.
D.编写两个线程,用于对Socket进行操作,一个将发送队列的内容发送出去,一个接收数据,将接收到的数据放入接收队列.这两个线程都是循环的,要注意,当没有数据处理的情况下,要进行sleep或退出循环的操作.如上所述,应该可以肆意收发消息了,只要针对发送队列和接收队列的监听线程进行编程,就可以搞定了.
readLine()方法只有在读取到终结字符时才会终止(比如\n)
你在server端发送的字符串后面加个“\n”或“\r”应该就没问题了。
{
waitlink();
}void waitlink()
{
try
{
ss=new ServerSocket(9871);
servers=ss.accept(); sdis=new BufferedReader(isr=new InputStreamReader(servers.getInputStream()));
String lineStr = sdis.readLine();
System.out.println(lineStr);
jta1.setText(lineStr);jta1.repaint();
if(lineStr.toString().startsWith("注册"))
{
String reginsert="insert into info values('"; for(int i=1;i<lineStr.toString().split(",").length;i++)
{
reginsert+=lineStr.toString().split(",")[i].toString()+"','";
} reginsert+="否','";
String clientip=servers.getInetAddress().toString();
reginsert+=clientip+"','"; String clientport=String.valueOf(servers.getPort()); reginsert+=clientport+"','"; try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=hc";
String user="sa";
String password="abcde";
Connection con=java.sql.DriverManager.getConnection(url,user,password);
Statement stmt=con.createStatement();
String sql="SELECT MAX(CONVERT(int, hhno)) AS no FROM info";
rs=stmt.executeQuery(sql);
while(rs.next())
{
if(rs.getString(1)==null)
{
reginsert+="1')";
}
else
{
int newno=Integer.parseInt(rs.getString(1))+1;
reginsert+=String.valueOf(newno)+"')";
}
}
ss.close();
stmt.executeUpdate(reginsert);
}
catch(Exception err)
{
err.printStackTrace();
}
ss.close();
}
else
{
ss.close();
jta1.setText("服务器返回值:"+lineStr);jta1.repaint();
bw=new java.io.BufferedWriter(osw=new OutputStreamWriter(servers.getOutputStream()));
bw.write("从server返回的数据\n");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
放到jta1.setText("服务器返回值:"+lineStr);jta1.repaint();
bw=new java.io.BufferedWriter(osw=new OutputStreamWriter(servers.getOutputStream()));
bw.write("从server返回的数据\n");
后面试试.
preferme 兄说的,我也知道,应该这样做,但关于synchronize还没有学到这里来,我只是想成功一次socket及serversocket收发通讯而以还请各位老师指教
server
package com.half.socket;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketImpl {
public static void main(String[] args){
try {
ServerSocket serverS=new ServerSocket(1234);
Socket socketC=null;
while(true){
socketC=serverS.accept();
DealSocket cl=new DealSocket(socketC);
new Thread(cl).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
Thread
package com.half.socket;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.io.DataInputStream;public class DealSocket implements Runnable{
private Socket socketC;
public DealSocket(Socket socketC) {
// TODO Auto-generated constructor stub
this.socketC=socketC;
} public void run() {
// TODO Auto-generated method stub
File f=new File("C:\\test.txt");
DataInputStream data;
StringBuffer bb=new StringBuffer();
try {
data = new DataInputStream(new FileInputStream(f));
byte b[]=new byte[(int)f.length()];
data.read(b,0,(int)f.length());
PrintWriter pw=new PrintWriter(socketC.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(socketC.getInputStream()));
if(true){
String str1=br.readLine();
System.out.println("accept"+str1);
bb.append(str1);
}
pw.print(new String(b)+"\r\n");
pw.flush();
pw.close();
br.close();
this.socketC.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
client
package com.half.socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;public class ClientSocketImpl { public static void main(String[] args){
try {
Socket c=new Socket("127.0.0.1",1234);
deal(c);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} private static void deal(Socket c) {
// TODO Auto-generated method stub
StringBuffer b=new StringBuffer();
try {
BufferedReader br=new BufferedReader(new InputStreamReader(c.getInputStream()));
PrintWriter pw=new PrintWriter(c.getOutputStream());
pw.print("test中文\r\n");
pw.flush();
if(true){
String str=br.readLine();
System.out.println("accept"+str);
b.append(str);
}
pw.close();
br.close();
c.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}