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());

    程序启动后,在服务端没有获取到字符串。

socket详解

看这段代码没有问题,检查下其他代码是否正确。这段是学习代码吧,不介意的话都贴出来让大家帮忙看看。

下面是我的代码:

服务端:
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这个方法呢?

readline阻塞了