利用TCP进行Java网络编程时,服务器端的开发步骤为:
1、创建ServerSocket,指定绑定的端口,通过ServerSocket对象的accept()方法来创建socket以实现服务器端与客户端的通信。
2、打开相关的输入输出流
3、按协议进行读写
4、关闭流和相应的socket。(对于同一个socket,如果关闭了输出流,则与该关联的socket也被关闭,而关闭socket时,相应的流会自动关闭,所以一般直接关闭socket即可。
类ServerThread
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.Socket;
/*
* 服务器端类ServerThread
*/
public class ServerThread extends Thread {
//和本线程相关的socket
Socket socket = null;
public ServerThread(Socket socket) {
this.socket =socket;
}
//线程执行操作,响应客户端请求
@Override
public void run() {
//获取客户端提交的信息,通过输入输出流实现
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
try {
is = socket.getInputStream();
//包装成字符流
isr = new InputStreamReader(is);
//加缓冲
br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!= null){
System.out.println("我是服务器端,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎你!");
pw.flush();//将缓冲输出
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
//对于同一个socket,如果关闭了输出流,则与该流关联的socket也会被关闭,
//在这里我们直接关闭socket,对应的输入输出流也会被关闭
if (socket != null)
socket.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
}
类Server,循环接收客户端的连接请求,一旦连接成功,就启用一个新线程
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 服务器端,每次与一个客户端连接时,会启动一个新的线程
*/
public class Server {
public static void main(String[] args) {
try {
//创建serversocket,指定绑定的端口
ServerSocket serverSocket = new ServerSocket(8888);
//记录客户端数量
int count = 0;
//调用accept()方法监听客户端
System.out.println("***Server is starting*****");
Socket socket = null;
while(true){
//调用accept()监听客户端请求
socket = serverSocket.accept();
//创建新线程与客户端通信
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
count++;
System.out.println("客户端数量为:"+count);
InetAddress address = socket.getInetAddress();
System.out.println("ip:"+ address.getHostAddress()); <span style="font-family: Arial, Helvetica, sans-serif;">//可以通过socket获取客户端主机ip地址</span>
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端的开发步骤如下:
1、创建socket,指定服务器地址和端口
2、用输出流向服务器端发送信息
3、用输入流获取服务器的反馈信息并打印到控制台
4、关闭相关流及socket
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.Socket;
import java.net.UnknownHostException;
/*
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
//创建socket,指定服务器地址和端口
Socket socket = new Socket("localhost",8888);
//用输出流向服务器端发送信息
OutputStream os = socket.getOutputStream();
//变成打印流
PrintWriter pw = new PrintWriter(os);
pw.write("用户名:qiaqia;密码:1234");
pw.flush();
socket.shutdownOutput();
//获取服务器的响应
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info=br.readLine())!= null){
System.out.println("我是客户端,服务器说:"+info);
}
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}