一个java Socket通信的例子

客户端代码:

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();那么关联这个writersocke也会关闭,所以流的关闭应在收发都结束之后再关闭。

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

      }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值