服务端:
package socket;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class SocketServer {
ServerSocket serverSocket = null;
Socket socket = null;
public SocketServer() {
try {
init();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void init() throws Exception {
serverSocket = new ServerSocket(9990);
}
public void run() {
try {
while(true) {
socket = serverSocket.accept();
MyServer ms = new MyServer(socket);
Thread td = new Thread(ms);
td.run();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SocketServer ss = new SocketServer();
ss.run();
}
}package socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;import file.HandleFile;public class MyServer implements Runnable {
Socket socket = null;
PrintWriter pw = null;
public MyServer(Socket socket) {
this.socket = socket;
}
public void run() {
// TODO Auto-generated method stub
try {
if(socket == null) {
throw new Exception();
}
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer sb = new StringBuffer();
String tmp = null;
while((tmp = br.readLine()) != null) {
sb.append(tmp);
}
System.out.println(sb.toString());
pw = new PrintWriter(socket.getOutputStream());
pw.println("袁泉");
pw.flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
pw.close();
}
}}客户端:
package socket;import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;import file.HandleFile;public class SocketClient {
Socket socket = null;
FileOutputStream fops = null;
OutputStream out = null;
InputStream input = null;
PrintWriter pw = null;
SocketClient() {
try {
init();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void init() throws Exception {
socket = new Socket("127.0.0.1", 9990);
}
public void run() {
try {
pw = new PrintWriter(socket.getOutputStream());
pw.println("夏雨");
pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer sb = new StringBuffer();
String temp = null;
while((temp = br.readLine()) != null) {
sb.append(temp);
}
System.out.println(sb.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
pw.close();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SocketClient sc = new SocketClient();
sc.run();
}}如果是单向的,客户端发送给服务端,正常
如果是需要服务端发回一个字符流,就阻塞了,我也不知道怎么回事,求教
package socket;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class SocketServer {
ServerSocket serverSocket = null;
Socket socket = null;
public SocketServer() {
try {
init();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void init() throws Exception {
serverSocket = new ServerSocket(9990);
}
public void run() {
try {
while(true) {
socket = serverSocket.accept();
MyServer ms = new MyServer(socket);
Thread td = new Thread(ms);
td.run();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SocketServer ss = new SocketServer();
ss.run();
}
}package socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;import file.HandleFile;public class MyServer implements Runnable {
Socket socket = null;
PrintWriter pw = null;
public MyServer(Socket socket) {
this.socket = socket;
}
public void run() {
// TODO Auto-generated method stub
try {
if(socket == null) {
throw new Exception();
}
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer sb = new StringBuffer();
String tmp = null;
while((tmp = br.readLine()) != null) {
sb.append(tmp);
}
System.out.println(sb.toString());
pw = new PrintWriter(socket.getOutputStream());
pw.println("袁泉");
pw.flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
pw.close();
}
}}客户端:
package socket;import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;import file.HandleFile;public class SocketClient {
Socket socket = null;
FileOutputStream fops = null;
OutputStream out = null;
InputStream input = null;
PrintWriter pw = null;
SocketClient() {
try {
init();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void init() throws Exception {
socket = new Socket("127.0.0.1", 9990);
}
public void run() {
try {
pw = new PrintWriter(socket.getOutputStream());
pw.println("夏雨");
pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer sb = new StringBuffer();
String temp = null;
while((temp = br.readLine()) != null) {
sb.append(temp);
}
System.out.println(sb.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
pw.close();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SocketClient sc = new SocketClient();
sc.run();
}}如果是单向的,客户端发送给服务端,正常
如果是需要服务端发回一个字符流,就阻塞了,我也不知道怎么回事,求教
StringBuffer sb = new StringBuffer();
String temp = null;
while((temp = br.readLine()) != null) {
sb.append(temp);
}
System.out.println(sb.toString());
变为
System.out.println(br.readLine())
就可以成功~
所以楼主可以先把用run()方法启动线程改为用start()启动试一下。
Client -> Server ,客户端向服务器发送一个消息,
Server -> Client ,服务端收到消息后做最简单的处理然后回复给客户端,并终止会话。
这里只是一个回合的往来。请注意,在这个场景中,实际上相当于半双工的效果,因为从程序的角度看,每个时刻要么是客户端有事情做,要么是服务端有事情做,不会双方同时都在工作。而这种演示的场景在现实的网络应用程序中几乎没有。
因为处理消息是不是按顺序来都是由程序的应用导来做的而不是在通信这层,在通信这层都会是工作在全双工的状态中。