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编程中,实现面向对象编程,传递的是一个对象。