客户端代码:
package socketTest;
import java.io.*;
import java.net.*;
public class Client
{
Socket socket;
BufferedReader in;
PrintWriter out;
public Client()
{
try
{
socket = new Socket("127.0.0.1", 10000);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
out.println("Send by Client!");
System.out.println("Get Server Message:"+in.readLine());
out.close();
in.close();
socket.close();
}
catch (IOException e)
{}
}
public static void main(String[] args)
{
new Client();
}
}
服务器代码:
package socketTest;
import java.net.*;
import java.io.*;
public class Server
{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server()
{
try
{
ss = new ServerSocket(10000);
socket = ss.accept();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
String line = in.readLine();
System.out.println("Get Client Message:"+line);
out.println("you input is :" + line);
out.close();
in.close();
socket.close();
}
catch (IOException e)
{}
}
public static void main(String[] args)
{
new Server();
}
}
这里需要注意的是
1. socket通信中服务器和客户端需要互相收发数据,而readLine()这个函数,如果接收到数据没有换行标志,就会一直堵塞在那
writer =new PrintWriter(new BufferedWriter(newOutputStreamWriter(
socket.getOutputStream())), true);
writer.print(Msg);
writer.flush();
因为writer.print()比writer.println()少了换行符,客户端永远收不到一行结束的标志。
用BufferdWriter时也会出现同样问题
writer =new BufferedWriter(newOutputStreamWriter(
socket.getOutputStream()));
writer.write(msg);
writer.flush();
需要加一行writer.newLine();在write(msg)之前
2. 在关闭流的时候,会把socket也关闭
比如上面,如果我在flush之后加上writer.close();那么关联这个writer的socke也会关闭,所以流的关闭应在收发都结束之后再关闭。
3. 如果只是接收一行数据
reader =new BufferedReader(newInputStreamReader(
socket.getInputStream()));
String msg = reader.readLine();
return msg;
就像上面这样写
如果想接收多行数据,就要用while循环
StringBuffer strbuf=new StringBuffer();
String line=null;
while((line=reader.readLine())!=null){
strbuf.append(line+"\n");
}
returnstrbuf.toString();
如果像上面这么写,会堵塞
应该加一个标志符,可以跳出while循环,客户端在发送的数据后加一个end
while((line=reader.readLine())!=null){
if(line.equalsIgnoreCase("end")){
break;
}
strbuf.append(line+"\n");
}