学习socket编程,遇到乱码问题。。倒腾半天,至少有个解决方案。
服务端:
package mmo.net.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
public class SServer
{
public static void main(String[] args)
{
try
{
ServerSocket httpd = new ServerSocket(8000, 10,
InetAddress.getByName("172.16.8.33"));
Socket socket = httpd.accept();
BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
while (true)
{
String data = read.readLine();
String data2 = new String(data.getBytes(Charset.forName("GBK")));
System.out.println("data == > " + data2.toString());
out.println(data2);
out.flush();
if(data.equals("end"))
break;
}
socket.close();
}
catch (UnknownHostException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
package mmo.net.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SClient
{
public static void main(String[] args) throws IOException
{
try
{
InetAddress inet = InetAddress.getByName("172.16.8.33");
Socket client = new Socket(inet, 8000);
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in,"gbk"));
while(true)
{
String data = wt.readLine();
out.println(data);
out.flush();
if(data.equals("end"))
{
break;
}
String data1 = in.readLine();
System.err.println("data1 == > " + data1);
}
client.close();
}
catch (UnknownHostException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
客户端// Sclient
有木有乱码!!!
data1 == > 有木有乱码!!!
//服务端
data == > 有木有乱码!!!
心得:
1.读写器默认是utf8格式
2.String data2 = new String(data.getBytes(Charset.forName("GBK"))); 其他编码无效
3.在读写器上设置gbk,也会出现乱码情况。