Java Socket第一个通讯程序的具体实现及常见问题的分析


<一>搭建服务器类

        服务器的搭建具体分为三个步骤:

                a:创建一个服务器套接字,并指定端口号。如:

                     ServerSocket server=new ServerSocket(8888)。
                                 这里的构造方法中的参数就是int port,端口号。这里我们要保证(port>1023),因为前面的端口已经被具体的应用程序占了,如果这里强制port<1023的话,可能会发生一些不可预知的错误。

               b:创建一个客户端的实例socket来连接服务器。如:

                    Socket client=server.accept()。
在服务器server没有连接到客户端之前,该语句会一直处于阻塞状态。一旦获取到实例,程序往下执行。

               c:对连接后实例化的client对象进行信息交流操作。

                        ①获取输入流。        

            BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
                       ②操作输入流,获取客户端的信息:
                //get input stream
		BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
		
		String infoFromClient=null;
		while((infoFromClient=in.readLine())!=null){
			System.out.println("Server get InfoFromClient:"+infoFromClient);//print the information from client
		}
		client.shutdownInput();//close input stream !Important
                       特别注意:这里使用完毕输入流的信息之后必须关闭输入流。不然会影响到输出流的信息交换。

                      ③获取输出流。

                //get output stream
		PrintWriter writer=new PrintWriter(client.getOutputStream())

                      ④操作输出流,向客户端传递消息:

		writer.println("hello,Client.I am server");
		writer.flush();
                      ⑤关闭打开的资源,输入输出流和客户端
		writer.close();
		in.close();
		client.close();

<二>客户端类的搭建
       客户端类的搭建大部分和服务器端类似。

                   ①创建一个Socket用来连接服务器,请求连接。(即被accpet()方法侦听到)

              Socket client=new Socket("localhost", 8888);//get connection to server;
                       特别注意:这里localhost为你服务器所在的主机名,我这里的这个demo由于是在自己的电脑上,所以直接用“localhost”(127.0.0.1),客户端的端口和服务器端创建的端口要一致,否则无法连接到。
                   ②建立连接后,可以获取输入输出流,具体方法参见服务器端的介绍。

<三>demo源码

Client.java

package socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/*
 * 创建Socket对象,指明需要连接的服务器的地址和端口
 * 建立连接后,通过输出流向服务器发送请求信息
 * 通过输入流获取服务器的响应信息
 * 关闭相应资源
 * */
public class Client {

	public static void main(String[] args) throws UnknownHostException, IOException {
		// TODO Auto-generated method stub
        Client client=new Client();
        client.onStart();
	}

	private void onStart() throws UnknownHostException, IOException {
		// TODO Auto-generated method stub
		Socket client=new Socket("localhost", 8888);//get connection to server;
		     System.out.println("****client connect to server****");
		//get output stream first !important
		PrintWriter out=new PrintWriter(client.getOutputStream());
		BufferedReader inconsole=new BufferedReader(new InputStreamReader(System.in));//input message from console
		     System.out.println("please input message to server:");
		String infoToServer=inconsole.readLine();
		while(infoToServer!=null){
		    out.write(infoToServer);
		    out.flush();
		    infoToServer=inconsole.readLine();
		   // break;
		}
		System.out.println("send successfully!");
		
		client.shutdownOutput();//close the outputStream
		
		//get input stream
		BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
		String infoFromServer=null;
		while((infoFromServer=in.readLine())!=null){
			System.out.println("Client get InfoFromServer:"+infoFromServer);
		}

		//close all
		inconsole.close();
		in.close();
		out.close();
	    client.close();
	}

}
Client.java
package socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
服务器端
  a)、创建ServerSocket对象绑定监听端口。
  b)、通过accept()方法监听客户端的请求。
  c)、建立连接后,通过输入输出流读取客户端发送的请求信息。
  d)、通过输出流向客户端发送请求信息。
  e)、关闭相关资源。
  author:zipple;2017-1-13
  bug:服务器端无法发送请求到客户端
* */
public class Server {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
      Server server=new Server();
      server.onStart();
	}

	private void onStart() throws IOException {
		     System.out.println("*************loading****************");
		ServerSocket serverSocket=new ServerSocket(8888);//new a server
		     System.out.println("server started successfully,wait for client...");
		Socket client = serverSocket.accept();//get connection
		
		//get input stream
		BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
		
		String infoFromClient=null;
		while((infoFromClient=in.readLine())!=null){
			System.out.println("Server get InfoFromClient:"+infoFromClient);//print the information from client
		}
		client.shutdownInput();//close input stream !Important
		
		
		//get output stream
		PrintWriter writer=new PrintWriter(client.getOutputStream());
		writer.println("hello,Client.I am server");
		writer.flush();
		
		writer.close();
		in.close();
		client.close();
	}

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值