下面是接收信息线程:
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 结束聊天的时候,程序不能正常停止。
客服端显示如下:TCP客服端启动........
ni ha.
收到 ip: 169.254.207.146; port:10001; loclport: 53582...content:niye hao.
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
他说再见,我也不再理他了!服务端这边并没有退出程序。这是因为还有一个进程没关闭的原因么。求高手简答一下。万分感谢。