黑马程序员技术交流社区
标题:
网络编程
[打印本页]
作者:
段波
时间:
2011-12-3 22:53
标题:
网络编程
本帖最后由 段波 于 2011-12-7 12:53 编辑
public class Servicer implements Runnable{
Socket s;
public Servicer(Socket s) {
this.s = s;
}
public void run() {
try {
InputStream ips= s.getInputStream();
OutputStream ops= s.getOutputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos= new DataOutputStream(ops);
while(true){
String str=br.readLine();
if(str.equalsIgnoreCase("quit")){
System.out.println("The Client has been out !");
break;
}
String strBack=str.toUpperCase();
dos.writeBytes(strBack);
br.close();
dos.close();
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class TcpServer {
public static void main(String[] args) {
try {
ServerSocket ss= new ServerSocket(8000);
while(true){
Socket s=ss.accept();
new Thread(new Servicer(s)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class TCPClient {
public static void main(String[] args) {
try {
Socket s= new Socket(InetAddress.getByName("172.16.9.115"),8000);
InputStream ips=s.getInputStream();
OutputStream ops= s.getOutputStream();
BufferedReader brKey= new BufferedReader(new InputStreamReader(System.in));
DataOutputStream dos= new DataOutputStream(ops);
BufferedReader brNet= new BufferedReader(new InputStreamReader(ips));
while(true){
String str= brKey.readLine();
dos.writeBytes(str+System.getProperty("line.separator"));
if(str.equalsIgnoreCase("quit")){
break;
}else
{
System.out.println(brNet.readLine());
}
}
dos.close();
brKey.close();
brNet.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
请问为什么客户端和服务端只能通信一次,客户端还没退出就自己死掉了呢?有时还返回null
作者:
成杰
时间:
2011-12-4 09:21
想要多通信几次的话,就要用到循环,一直等待客户端的输入
作者:
李盈科
时间:
2011-12-4 19:32
要用到while()的
作者:
周敏2011nc
时间:
2011-12-5 09:56
在service端,你将关闭的通道代码写在了while循环内,当然执行一次后,链接就被断开,同时,service端和Client端你都使用的是readLine()方法,该方法是阻塞式的,你在Client写了结束标记(System.getProperty("line.separator")),但在service端却没用写,因加上。
作者:
刘海涛
时间:
2011-12-5 13:40
本帖最后由 刘海涛 于 2011-12-5 13:49 编辑
你这段代码好多错误,我修改了下,你可以复制运行。
1.close() 关闭的地方不对,应该是在程序结束才关闭,不应该放在循环,所以导致你的刚连接上发信息就退出。
2. 服务器回写客户端的时候也应该加System.getProperty("line.separator")。
3. Client 用了两次读取 导致也无法打印,使得程序阻塞,打印的应该是服务器回显的。大写。
String str= brKey.readLine();
dos.writeBytes(str+System.getProperty("line.separator"));
if(str.equalsIgnoreCase("quit")){
break;
}else
{
System.out.println(brNet.readLine());
}
具体解决方案见下面代码。
4 资源关闭前应该判断是否为空,否则抛空指针异常。
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8000);
while (true) {
Socket s = ss.accept();
new Thread(new Servicer(s)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Servicer implements Runnable {
Socket s;
public Servicer(Socket s) {
this.s = s;
}
public void run() {
BufferedReader br = null;
DataOutputStream dos = null;
try {
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
br = new BufferedReader(new InputStreamReader(ips));
dos = new DataOutputStream(ops);
while (true) {
String str = br.readLine();
if (str.equalsIgnoreCase("quit")) {
System.out.println("The Client has been out !");
break;
}
String strBack = str.toUpperCase();
System.out.println(strBack);
dos.writeBytes(strBack + System.getProperty("line.separator"));
dos.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
if (dos != null) {
dos.close();
}
if (s != null) {
s.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) {
BufferedReader brKey = null;
DataOutputStream dos = null;
BufferedReader brNet = null;
Socket s = null;
try {
s = new Socket(InetAddress.getByName("127.0.0.1"), 8000);
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
brKey = new BufferedReader(new InputStreamReader(System.in));
dos = new DataOutputStream(ops);
brNet = new BufferedReader(new InputStreamReader(ips));
while (true) {
String str = brKey.readLine();
dos.writeBytes(str + System.getProperty("line.separator"));
if (str.equalsIgnoreCase("quit")) {
break;
}
dos.flush();
System.out.println(brNet.readLine());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dos != null) {
dos.close();
}
if (brKey != null) {
brKey.close();
}
if (brNet != null) {
brNet.close();
}
if (s != null) {
s.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
复制代码
作者:
许邦存
时间:
2011-12-5 20:23
楼主的问题应该是出在客户端和服务端都在等待,因为都有阻塞式方法readLine(),导致两端都在等待,比如客户端向服务端发送中并只是把回车符之前的发送给服务端,服务端没收到结束标志,导致停在那了,应该客户端 dos.writeBytes(str+System.getProperty("line.separator"));String str= brKey.readLine();再加上写过去换行。同样在服务端中也没有回车符的结束标志,也应该在dos.writeBytes(strBack);后再加换行符写过去给客户端。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2