在下写的serversock和socket代码,服务器能够成功接收客户端的信息,并处理相关业务,但就是无法返回信息给客户端,还望各位老师指教//SERVER端
package testsocket;
import java.lang.*;
import java.io.*;
import java.net.*;
import java.sql.*;public class newmain extends javax.swing.JFrame { //服务器端主窗体
public static String lr=""; //用于存放客户端传来的信息中的某一个字符串
public newmain() {
initComponents();
}
private void initComponents() {// 此处窗体构造部分忽略
}
public static void main(String args[]) throws IOException{
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new newmain().setVisible(true);
}
});
ServerSocket s=new ServerSocket(8056);
while(true){
Socket socket=s.accept();//无限监听客户的请求
try
{
new Ctosthread(socket);//创建新线程
}
catch(IOException e)
{
socket.close();
}
}
}
// 变量声明 - 不进行修改
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
public static javax.swing.JTextArea jta1;
// 变量声明结束
}
class Ctosthread extends java.lang.Thread //此类用于接收client发来的信息 ,此类能够成功接收,并在服务器端根据接收值进行数据库处理
{
private Socket ts;
private BufferedReader in;//定义输入流
private PrintWriter out;//定义输出流
private boolean flag=false;
private java.sql.ResultSet rs;
public Ctosthread(Socket socket) throws IOException
{
this.ts=socket;
in=new BufferedReader(new InputStreamReader(ts.getInputStream()));//创建输入流
start();//启动线程
}
public void run()
{
if(!flag)
{
flag=true;
try
{
String lineStr = in.readLine();
if(lineStr.toString().startsWith("注册"))
{
newmain.lr="注册";
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=ts.getInetAddress().toString();
reginsert+=clientip+"','"; String clientport=String.valueOf(ts.getPort());
reginsert+=clientport+"','"; try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=hhdb";
String user="sa";
String password="135ade";
Connection con=java.sql.DriverManager.getConnection(url,user,password);
Statement stmt=con.createStatement();
String sql="SELECT MAX(CONVERT(int, no)) AS hhno 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)+"')";
}
}
stmt.executeUpdate(reginsert);
}
catch(Exception err)
{
err.printStackTrace();
}
}
if(newmain.lr=="")//如果主类(窗体类中的String类型变量 lr值依然为空,就启用回发client端类)
{
serversend ssd=new serversend(ts,newmain.lr);
ssd.start();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
} class serversend extends Thread //此类用于向cleint端回发信息 此类不能成功,client端无法接收服务器回传来的信息
{
PrintWriter outy;
Socket sendsocket;
String se="";
public serversend(Socket socket,String s) //此处传入的s即是主窗体中的lr值
{
this.sendsocket=socket;
this.outy=null;
this.se=s;
}
public void run()
{
if(se=="") //如果主窗体类的lr值为空
{
try{
outy=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sendsocket.getOutputStream())),true);//创建输出流
System.out.println("运行到else了");
outy.write("返回给client来了\n");
outy.flush();
sendsocket.close();
}
catch(Exception ex)
{
}
}
}
}
/*
报错如下:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at testsocket.Ctosthread.run(newmain.java:125)
生成成功(总时间:25 秒)
*/
package testsocket;
import java.lang.*;
import java.io.*;
import java.net.*;
import java.sql.*;public class newmain extends javax.swing.JFrame { //服务器端主窗体
public static String lr=""; //用于存放客户端传来的信息中的某一个字符串
public newmain() {
initComponents();
}
private void initComponents() {// 此处窗体构造部分忽略
}
public static void main(String args[]) throws IOException{
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new newmain().setVisible(true);
}
});
ServerSocket s=new ServerSocket(8056);
while(true){
Socket socket=s.accept();//无限监听客户的请求
try
{
new Ctosthread(socket);//创建新线程
}
catch(IOException e)
{
socket.close();
}
}
}
// 变量声明 - 不进行修改
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
public static javax.swing.JTextArea jta1;
// 变量声明结束
}
class Ctosthread extends java.lang.Thread //此类用于接收client发来的信息 ,此类能够成功接收,并在服务器端根据接收值进行数据库处理
{
private Socket ts;
private BufferedReader in;//定义输入流
private PrintWriter out;//定义输出流
private boolean flag=false;
private java.sql.ResultSet rs;
public Ctosthread(Socket socket) throws IOException
{
this.ts=socket;
in=new BufferedReader(new InputStreamReader(ts.getInputStream()));//创建输入流
start();//启动线程
}
public void run()
{
if(!flag)
{
flag=true;
try
{
String lineStr = in.readLine();
if(lineStr.toString().startsWith("注册"))
{
newmain.lr="注册";
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=ts.getInetAddress().toString();
reginsert+=clientip+"','"; String clientport=String.valueOf(ts.getPort());
reginsert+=clientport+"','"; try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=hhdb";
String user="sa";
String password="135ade";
Connection con=java.sql.DriverManager.getConnection(url,user,password);
Statement stmt=con.createStatement();
String sql="SELECT MAX(CONVERT(int, no)) AS hhno 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)+"')";
}
}
stmt.executeUpdate(reginsert);
}
catch(Exception err)
{
err.printStackTrace();
}
}
if(newmain.lr=="")//如果主类(窗体类中的String类型变量 lr值依然为空,就启用回发client端类)
{
serversend ssd=new serversend(ts,newmain.lr);
ssd.start();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
} class serversend extends Thread //此类用于向cleint端回发信息 此类不能成功,client端无法接收服务器回传来的信息
{
PrintWriter outy;
Socket sendsocket;
String se="";
public serversend(Socket socket,String s) //此处传入的s即是主窗体中的lr值
{
this.sendsocket=socket;
this.outy=null;
this.se=s;
}
public void run()
{
if(se=="") //如果主窗体类的lr值为空
{
try{
outy=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sendsocket.getOutputStream())),true);//创建输出流
System.out.println("运行到else了");
outy.write("返回给client来了\n");
outy.flush();
sendsocket.close();
}
catch(Exception ex)
{
}
}
}
}
/*
报错如下:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at testsocket.Ctosthread.run(newmain.java:125)
生成成功(总时间:25 秒)
*/
解决方案 »
- 我想做这么个东西,麻烦谁能给个思路谢谢
- LOMBOZ ECLIPSE中运行JSP时的配置
- 如何使JTextArea随着窗体的变化自动调整大小.
- 使用secure shell协议包的开发的问题
- 如何在一个页面上显示多个jfreechart的图像啊
- 如何对vector的对象进行排序操作?
- 我想做网络对战游戏,高手进来
- 初学者,很简单的问题,JAVA需要像C++那样包含类吗?
- main也能继承下来????????????????????????????????????????????????????????
- 各位高手:我在第次连结完数据库,执行完查询,其中的
- resin集群支持多少台机器?
- java如何读写pdf文件,并转化成二进制文件。
楼主【cqandy】截止到2008-07-29 16:05:02的历史汇总数据(不包括此帖):
发帖的总数量:15 发帖的总分数:500 每贴平均分数:33
回帖的总数量:14 得分贴总数量:1 回帖的得分率:7%
结贴的总数量:15 结贴的总分数:500
无满意结贴数:1 无满意结贴分:50
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:6.67 % 无满意结分率:10.00 %
敬礼!
import java.awt.Color;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.tree.*;
import javax.swing.tree.DefaultTreeModel;
import java.sql.*;
import java.net.*;
import java.io.*;
import java.lang.*;public class chatpanel extends javax.swing.JFrame implements Runnable{
javax.swing.tree.DefaultMutableTreeNode dmtn=new javax.swing.tree.DefaultMutableTreeNode("root");
javax.swing.tree.DefaultTreeModel dtm=null;
java.sql.ResultSet rs;
public static String sessionno;
public static String sessionpwd;
Socket link_server=new Socket();
String link_sports="8056";
java.net.SocketAddress link_sa=null;
BufferedWriter link_bwout=null;
BufferedReader link_in=null;
String link_server_ip=null;
boolean flag=false; public chatpanel() {
initComponents();
jLabel1.setText(Main.sessionno.toString().trim());
this.getContentPane().setBackground(Color.WHITE);
dtm=new DefaultTreeModel(dmtn);
dtm.setRoot(dmtn);
jTree1.setModel(dtm);
jScrollPane1.setBorder(null);
}
public void run()
{
System.out.println("chatpanel运行了");//这里能正常打印出来
String send_info=Main.flag.toString().trim()+","+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_bwout.write(send_info);
link_bwout.flush();
link_in=new BufferedReader(new InputStreamReader(link_server.getInputStream()));
System.out.println(send_info);
String readstr=null;
if(true)
{
System.out.println("到ifelse了");//这里能正常打印出来
readstr=link_in.readLine();
System.out.println("值来了:"+readstr);
}
link_bwout.close();
link_server.close();
}
catch(Exception e)
{
}
}
private void initComponents() {
//此处窗体构造,忽略
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new chatpanel().setVisible(true);
}
});
}
// 变量声明 - 不进行修改
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTree jTree1;
// 变量声明结束
}
protected static Logger m_Logger;
protected String m_szIP ;
protected int m_nPort;
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE=10;//单个CPU线程池大小
protected static String FIELD_TITLE = "Description";
protected static String FIELD_ID = "JobID";
protected static String INDEX_STORE_PATH = "E:\\Baizeju\\Index";
public IndexSeeker( ) {
Logger.initialLogger();
m_Logger = new Logger();
}
public IndexSeeker( String szIP, int nPort ) throws IOException{
Logger.initialLogger();
m_Logger = new Logger();
m_szIP = szIP;
m_nPort = nPort;
serverSocket=new ServerSocket(m_nPort);
//Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE/2);
m_Logger.info("IndexSeeker","IndexSeeker","服务器启动");
m_Logger.info(System.getProperty("file.encoding"));
}
public void run() {
while(true){
Socket socket=null;
try {
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket=serverSocket.accept();
executorService.execute( new searchHandler(socket) );
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void shutDown() {
}
public static void main( String[] args ) {
IndexSeeker seeker=null;
try {
seeker = new IndexSeeker( "127.0.0.1", 10001 );
Thread thread = new Thread( seeker);
thread.start();
}
catch( IOException e ) {
System.out.println( "Cannot open server port!");
System.exit(-1);
}
}
} class searchHandler implements Runnable {
protected static String FIELD_TITLE = "Description";
protected static String FIELD_ID = "JobID";
protected static String INDEX_STORE_PATH = "E:\\Baizeju\\Index";
private Socket socket;
public searchHandler(Socket socket){
this.socket=socket;
}
private PrintWriter getWriter(Socket socket) throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket) throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public String echo(String msg){
return "echo:"+msg;
}
public void run(){
Logger logger = new Logger();
try {
System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
BufferedReader br=getReader(socket);
PrintWriter pw=getWriter(socket);
String msg=null;
while((msg=br.readLine())!=null){
if( !msg.trim().equalsIgnoreCase("") ) {
ArrayList<String> results = doSearch( new String(msg.getBytes(),"GBK" ) );
for( int nIndex=0; nIndex<results.size();nIndex++) {
pw.print(new String(results.get(nIndex).getBytes("GBK")));
pw.print("<br>");
}
pw.println();
}
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(socket!=null){
socket.close();
}
System.out.println( "Connection closed!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public ArrayList<String> doSearch( String szQuery ) {
ArrayList<String> results = new ArrayList<String>();
try {
//Directory ramDir = new RAMDirectory(INDEX_STORE_PATH);
// 将庖丁封装成符合Lucene要求的Analyzer规范
Analyzer analyzer = new PaodingAnalyzer();
IndexReader reader = IndexReader.open( INDEX_STORE_PATH ); QueryParser parser = new QueryParser(FIELD_TITLE, analyzer);
Query query = parser.parse(szQuery);
Searcher searcher = new IndexSearcher(INDEX_STORE_PATH);
query = query.rewrite(reader);
System.out.println("Searching for: " + new String( query.toString().getBytes("GBK")));
Hits hits = searcher.search(query); int nItemNumber = Math.min( 20, hits.length());
for (int i = 0; i < nItemNumber; i++) {
String szText = hits.doc(i).get(FIELD_TITLE);
QueryScorer scorer = new QueryScorer( query );
Highlighter highlighter = new Highlighter( new SimpleHTMLFormatter("<b><I>", "</I></b>"),scorer ); TokenStream tokenStream = new PaodingAnalyzer().tokenStream( FIELD_TITLE, new StringReader(szText));
results.add(highlighter.getBestFragment(tokenStream, szText));
}
//reader.close();
}
catch( CorruptIndexException e ) {
e.printStackTrace();
}
catch( IOException e ) {
e.printStackTrace();
}
catch( ParseException e ) {
e.printStackTrace();
}
catch( Exception e ) {
e.printStackTrace();
}
return results;
}
}
应该是刚刚进run的前面吧,String lineStr = in.readLine();
在这一行就出Exception了,当然走不到后面初始化serversend ssd=new serversend(ts,newmain.lr); 那里,也就没有给客户端发信息了。
http://www.baizeju.com/html/Java/200807/30-159.html
了解一下Java Socket编程各种Exception的含义。
你遇到的异常说明如下:
第4个异常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。看来问题出在客户端,客户端退出,但是退出前没有关闭链接,造成这个异常。下面来看看客户端为什么会退出。
你关闭链接用的是link_server.close(); 如果没有走到这一句,就不会关闭。你下面的
catch(Exception e)
{
}
看上去就很可疑。在里面增加一句:e.printStackTrace();看看,再跑一次,狐狸尾巴就出来了。客户端报错:
java.lang.NullPointerException
at TestCode.SocketClient.run(SocketClient.java:65)
at TestCode.SocketClient.main(SocketClient.java:104)
BUILD SUCCESSFUL (total time: 1 second)
到65行去看看:
link_bwout.write(send_info);
link_bwout是null。找一找,link_bwout好像没有初始化啊。
package socketcs;import java.awt.BorderLayout;
import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.*;
public class serversk extends JFrame
{
JLabel title=new JLabel("服务器监视登录");
javax.swing.JScrollPane jsp;
public static javax.swing.JTextArea jta1;
public serversk()
{
this.setLayout(new BorderLayout());
jsp=new JScrollPane();
jta1=new JTextArea();
jta1.setSize(640,480);
jsp.setViewportView(jta1);
jta1.setVisible(true);
this.getContentPane().add(title,BorderLayout.NORTH);
title.setVisible(true);
this.getContentPane().add(jsp,BorderLayout.CENTER);
}
public static void main(String[] args)
{
serversk sk=new serversk();
sk.setSize(800,600);
sk.setVisible(true);
try{
ServerSocket ss=new ServerSocket(9516);
Socket s=ss.accept();
inout ios=new inout(s);
new Thread(ios).start();
}
catch(Exception e)
{
e.printStackTrace();
}
sk.setDefaultCloseOperation(sk.EXIT_ON_CLOSE);
}
}class inout implements Runnable
{
Socket iosocket=null;
java.io.BufferedReader br=null;
java.io.BufferedWriter bw=null;
public inout(Socket ss)
{
this.iosocket=ss;
} public void run() {
try
{
bw=new BufferedWriter(new java.io.OutputStreamWriter(iosocket.getOutputStream()));
br=new BufferedReader(new java.io.InputStreamReader(iosocket.getInputStream()));
if(true)
{
String gets=br.readLine();
serversk.jta1.append(gets);
}
bw.write("收到");
bw.flush();
bw.close();
br.close();
this.iosocket.close();
}
catch(Exception ex)
{
}
}
}client端
package h;
import java.io.*;
import java.net.*;
import javax.swing.*;public class cinout extends javax.swing.JFrame {
java.net.Socket c=new Socket();
java.net.SocketAddress link_sa=null;
BufferedWriter cout=null;
BufferedReader cin=null;
String link_sports="9516";
String link_server_ip=null;
boolean flag=false;
public cinout() {
initComponents();
}
private void initComponents() {
//略
}// </editor-fold> private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//此处第一次按下收发正常,再按即报错
try{
if(cjtf1.getText().length()>0)
{
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));
c.connect(link_sa);
flag=true; cin=new BufferedReader(new java.io.InputStreamReader(c.getInputStream()));
cout=new BufferedWriter(new java.io.OutputStreamWriter(c.getOutputStream()));
cout.write(cjtf1.getText()+"\n");
cout.flush();
if(true)
{
String appstr=cin.readLine();
cjta1.append(appstr);
}
cout.close();
cin.close();
c.close();
}
else
{
cjtf1.setText("请输入信息");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new cinout().setVisible(true);
}
});
}
// 变量声明 - 不进行修改
private javax.swing.JTextArea cjta1;
private javax.swing.JTextField cjtf1;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
// 变量声明结束
}
-----------------------客户端package test2;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 Client {
private Socket socket; private BufferedReader in; private PrintWriter out; public Client() {
try {
socket = new Socket("localhost", 8020);
in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
System.out.println("请输入你要说的话");
BufferedReader line = new BufferedReader(new InputStreamReader(
System.in));
String message = line.readLine();
System.out.println(message);
out.write(message);
out.flush();
line.close();
in.close();
out.close();
socket.close(); } catch (UnknownHostException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} public static void main(String[] args) {
// TODO 自动生成方法存根
new Client();
}}----------------------------服务器端package test2;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Service { private ServerSocket ss; private Socket socket; private PrintWriter out; private BufferedReader in; public Service() {
try {
ss = new ServerSocket(8020);
while (true) {
socket = ss.accept();
in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
String line = in.readLine();
System.out.println("你输入的是" + line);
out.close();
in.close();
socket.close();
// ss.close();
} } catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} } public static void main(String[] args) {
// TODO 自动生成方法存根
new Service();
}}