socket编程一

socket是基于TCP/IP协议的一种客户端与服务器端通信交流的一种重要的手段:

下面实现的是一个客户端,对服务器发送请求,客户端收到服务端的回复!

第一步:新建一个java Project  如下图所示:



第二步:服务器端的代码如下:

package com.socket.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器端
 * 
 * @author lfc 对于这个客户端以及服务端,运行的时候,必须先服务端开始运行起来,开始监听客户端的程序请求
 * 现在传递的只是一个字符串
 */
public class SocketServer {

	public static void main(String[] args) {
		
		System.out.println("服务器端准备好监听客户端的请求了。。。");
		try {
			// 1:创建一个服务端的ServerScoket,绑定端口开始监听
			ServerSocket serverScoket = new ServerSocket(8800);
			// 2:使用accept()方法阻塞等待连接,获得新的连接
			Socket socket = serverScoket.accept();
			// 3:获得输入流
			InputStream is = socket.getInputStream();
			// 包装下变成字符流
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			//创建输出流,用来给客户端提示的响应信息
			OutputStream os = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(os);
			// 4:读取用户输入的信息
			String info = null;
			while (!((info = br.readLine()) == null)) {
				System.out.println("我是服务器打印出来的内容,客户端输入的内容是:\n" + info);

			}
			//给客户端的回应信息
			String response="客户端已经收到你们的信息了,Success";
			pw.write(response);
			pw.flush();
			// 5:关闭资源,注意,关闭的时候,要从底部开始往上依次关闭,顺序不能错!
			os.close();
			pw.close();
			br.close();
			is.close();
			socket.close();
			serverScoket.close();

		} catch (IOException e) {

			e.printStackTrace();
		}

		System.out.println("本次服务端监听结束!。。。");
	}

}





第三步:编写服务器端的代码如下:



package com.socket.client;

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

/**
 * 客户端
 * 
 * @author lfc
 * 
 */
public class loginClient {

	public static void main(String[] args) throws UnknownHostException {

		try {
			// 1,创建serverScoket客户端,绑定服务器端的ip以及端口
			Socket scoket = new Socket("localhost", 8800);
			// 2,得到scoket读写流
			OutputStream os = scoket.getOutputStream();
			// 获得输入流
			InputStream is = scoket.getInputStream();
			// 包装下变成字符流
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			// 3,利用一定的协议对scoket中的对读写操作
			PrintWriter pw = new PrintWriter(os);
			String info = "用户名是:tom,密码是:123456 ";
			pw.write(info);
			pw.flush();
			//需要先关闭,一定要记得先关闭
			scoket.shutdownOutput();
			//接收并显示收到服务器端返回的信息!
			String answer = null;
			while (!((answer = br.readLine()) == null)) {
				System.out.println("我是服务器端接收并且给返回的信息:\n" + answer);

			}
			// 4,关闭流
			br.close();
			is.close();
			pw.close();
			os.close();
			scoket.close();

		} catch (IOException e) {

			e.printStackTrace();
		}
		System.out.println("客户端请求完毕!");
	}

}



第四步:ctrl+f11运行服务端的代码,运行服务端的代码后如下:



第五步:运行客户端的代码  ctrl+f11  如下图:


 

第六步:我们再打开服务器端的控制台打印信息如下图所示:



 

备注:对于本次的代码,有一个比较大的缺点是,java是面向对象编程的,这里是一个字符串,不是一个对象,在socket编程中,实现面向对象编程,传递的是一个对象。

猜你喜欢

转载自lfc-jack.iteye.com/blog/2332397