问题描述
- socket编程 客户端与服务器之间传递消息
-
客户端向服务端发送一字符串,
BufferedWriter pw= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
pw.write("hello");
pw.flush();在服务端获取:
BufferedReader br= new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(br.readLine());程序启动后,在服务端没有获取到字符串。
解决方案
解决方案二:
看这段代码没有问题,检查下其他代码是否正确。这段是学习代码吧,不介意的话都贴出来让大家帮忙看看。
解决方案三:
下面是我的代码:
服务端:
import java.io.*;
import java.net.Socket;
import java.net.ServerSocket;
import java.util.Scanner;
public class Server extends Thread {
private ServerSocket ss;
private BufferedReader br ;
public void init()
{
try {
ss = new ServerSocket(10000);
}
catch (IOException e) {
System.out.println("failed to start server");
}
}
public void run()
{
Scanner sc = new Scanner(System.in);
while(true) {
try {
Socket s = null;
s = ss.accept();
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(br.readLine());
} catch (Exception e) {
//e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
Server srv = new Server();
srv.init();
srv.start();
}
}
客户端:
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client extends Thread{
private Socket socket;
private BufferedWriter pw;
public Socket getSocket() {
return socket;
}
//向服务端发送数据
public void run(){
boolean reConnect = false;
connServer();
Scanner sc = new Scanner(System.in);
while (true) {
try{
socket.sendUrgentData(12);
if (reConnect) {
connServer();
reConnect = false;
}
}catch(IOException e){
System.out.println("reConnection...");
reConnect = true;
continue;
}
try {
pw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
pw.write("hello");
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//建立连接
public void connServer(){
try {
socket = new Socket("127.0.0.1", 10000);
} catch (Exception e) {
System.out.println("connection refused");
}
}
public static void main(String[] args) {
Client1 client1 = new Client1();
//client1.connServer(); //连接服务端
client1.start();
}
}
解决方案四:
这个你可以找本socket这方面的书箱研究研究
解决方案五:
猜测是pw没有关闭的原因
解决方案六:
使用netty,帮你封装了socket
解决方案七:
客户端传送数据给服务端,客户端应该是使用输入缓冲区吧
解决方案八:
测试了下你的代码,之所以没有打印hello是因为你写入流使用错误,在client的写入类用PrintWriter来发送请求数据的话就能在服务器端正确打印了。
还有就是你的socket.sendUrgentData(12);调用有问题,你在线程中循环往同一个socket中发送数据的话,只能发送大约12条左右,程序就进入异常分支了。
可以修改你的客户端代码如下:
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client extends Thread {
private Socket socket;
private PrintWriter pw;
public Socket getSocket() {
return socket;
}
// 向服务端发送数据
public void run() {
boolean reConnect = false;
connServer();
Scanner sc = new Scanner(System.in);
while (true) {
try {
socket.sendUrgentData(12);
if (reConnect) {
connServer();
reConnect = false;
}
} catch (IOException e) {
System.out.println("reConnection...");
e.printStackTrace();
reConnect = true;
continue;
}
try {
pw = new PrintWriter(socket.getOutputStream());
pw.write("hello");
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 建立连接
public void connServer() {
try {
socket = new Socket("127.0.0.1", 10000);
} catch (Exception e) {
System.out.println("connection refused");
}
}
public static void main(String[] args) {
Client client1 = new Client();
// client1.connServer(); //连接服务端
client1.start();
}
}
这样服务器端就能正常打印hello了。但是由于你调用了socket.sendUrgentData(12);你的while循环发送一定数量的hello后,程序就进入异常了。
你的这段代码的意图是什么呢?为什么client端要用线程循环往同一个Socket中发送数据呢?为什么要调用sendUrgentData这个方法呢?