服务器和客服端对话,结果总是出现错误。
下面是接收信息线程:
package cn.dzr.tcp.service;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class RecieveMessage implements Runnable
{
Socket socket;
public RecieveMessage(Socket socket)
{
this.socket = socket;
}
public void run()
{
recvice();
}
private void recvice()
{
try
{
while(true)
{
InputStream in = socket.getInputStream();
byte[] buff = new byte[1024];
int len = in.read(buff);
String ip = socket.getLocalAddress().getHostAddress();
int port = socket.getPort();
int port2 = socket.getLocalPort();
String text = new String(buff,0,len);
System.out.println("收到 ip: "+ip +"; port:"
+port +"; loclport: "+port2+ "...content:"
+ text);
if( text.equals("886"))
{
System.out.println("他说再见,我也不再理他了!");
break;
}
}
socket.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
package cn.dzr.tcp.service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class SendMessage implements Runnable
{
Socket socket;
public SendMessage(Socket socket)
{
this.socket = socket;
}
public void run()
{
sendMessage();
}
private void sendMessage()
{
try
{
OutputStream out = socket.getOutputStream();
BufferedReader bufr = new BufferedReader(new
InputStreamReader(System.in));
while(true)
{
String str = bufr.readLine();
out.write(str.getBytes());
if(str.equals("886"))
{
break;
}
}
try
{
Thread.sleep(20);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
socket.close();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package cn.dzr.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import cn.dzr.tcp.service.RecieveMessage;
import cn.dzr.tcp.service.SendMessage;
public class TcpServiceDemo
{
public static void main(String[] args) throws IOException
{
/*
* 服务端程序的编写
* 1,建立套接字,规定其使用的端口
* 2,建立连接。
* 3,获取客服端的套接字
* 4,通过客服端套接字获取客服端传过来的信息
* 5,关闭连接
*/
System.out.println("TCP服务端启动........");
//创建服务端套接字,指定端口
ServerSocket ss = new ServerSocket(10001);
//获取想连接过来的客服端程序
//这里只能获取一次么?
Socket s = ss.accept();
new Thread(new RecieveMessage(s)).start();
new Thread(new SendMessage(s)).start();
if(s.isClosed())
{
ss.close();
}
}
}
package cn.dzr.tcp;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import cn.dzr.tcp.service.RecieveMessage;
import cn.dzr.tcp.service.SendMessage;
public class TcpClientDemo
{
public static void main(String[] args) throws UnknownHostException, IOException
{
/*
* 1, 建立套接字
* 2, 建立连接
* 3, 发送数据
* 4, 关闭连接
*/
System.out.println("TCP客服端启动........");
//建立客服端套接字,该套接字连接到本地,构造函数的第一个参数为需要连接到的对象,
//第二个为服务端端口
//但该程序使用哪个端口发送数据是未知的。这里的端口是对面的服务器
Socket socket = new Socket(
InetAddress.getLocalHost().getHostName(), 10001);
// 获取输出流,然后程序可以通过输出流写入数据,数据会传输到服务端
new Thread( new SendMessage(socket)).start();
new Thread(new RecieveMessage(socket)).start();
//关闭套接字
//关于out的问题,out只是一个引用,即便不存在out,socket流也会存在
//当socket关闭之后,socket流就关闭掉,out则会指向到一个不存在的位置,自然
//也不会占用资源,所以无需关闭.
//socket.close();
}
}
886
Exception in thread "Thread-1" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.checkBounds(String.java:371)
at java.lang.String.<init>(String.java:535)
at cn.dzr.tcp.service.RecieveMessage.recvice(RecieveMessage.java:36)
at cn.dzr.tcp.service.RecieveMessage.run(RecieveMessage.java:19)
at java.lang.Thread.run(Thread.java:722)
服务端显示如下:
TCP服务端启动........
收到 ip: 169.254.207.146; port:53582; loclport: 10001...content:ni ha.
niye hao.
收到 ip: 169.254.207.146; port:53582; loclport: 10001...content:886
他说再见,我也不再理他了!
服务端这边并没有退出程序。这是因为还有一个进程没关闭的原因么。求高手简答一下。万分感谢。
[解决办法]
太多了,看不完。
只是你服务端是多线程啊,关闭接收的只是一个线程,主线程一直都在的。
如果有一个客户端的请求结束,服务端就结束主进程,那QQ还不崩盘了。