通过socket 实现TCP的编程
概念.socket :由ip和端口组成
首先建立ServerSocket 服务端的socket类。用户监听客户端发来的请求,因为实际应用是响应多客户端所以这里的Server循环监听等待客户端的连接
package com.socket.util;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于TCP协议的Socket通信,实现用户登录
* 服务端
* @author chenbian
*
*/
public class Server {
public static void main(String[] args) throws IOException {
//1.创建一个服务器端Socket。即ServerSocket。指定绑定端口,并监听此端口
ServerSocket serverSocekt = new ServerSocket(6666);
//2.调用accept方法开始监听,等待客户端
System.out.println("******服务器即将启动,等待客户端的连接");
Socket socket = null;
//循环监听等待客户端的连接
//客户端连接数
int count = 0;
while(true){
socket = serverSocekt.accept();
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
count++;
System.out.println("客户端的数量为"+count);
InetAddress address =socket.getInetAddress();
System.out.println("当前客户端的ip为"+address.getHostAddress());
}
}
}
2. 建立服务端socket线程处理类
package com.socket.util;
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;
/**
* 服务器线程处理类
* @author chenbian
*
*/
public class ServerThread extends Thread{
Socket socket = null;
public ServerThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
//3.获取一个输入流 ,读取客户端发送的信息
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 ifno =null;
while ((ifno= br.readLine())!=null) {
System.out.println("我服务器,客户端说"+ifno);
}
socket.shutdownInput();//关闭输入流
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("ok");
pw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(pw!=null)
pw.close();
if(os!=null)
os.close();
//5.关闭资源
if(br!=null)
br.close();
if(isr!=null)
isr.close();
if(is!=null)
is.close();
if(socket!=null)
socket.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
3.建立客户端socket 类
package com.socket.util;
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;
/**
* 客户端
* @author chenbian
*
*/
public class Client {
public static void main(String[] args) throws Exception, IOException {
//1创建客户端Socket。指定服务器的端口和地址
Socket socket = new Socket("localhost",6666);
//获取输出流 ,想服务器发送信息
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);//将输出流转成打印流
pw.write("用户名:admin2,密码12345");
pw.flush();
socket.shutdownOutput();
InputStream is = socket.getInputStream();
InputStreamReader isr =new InputStreamReader(is);//将字节流转化为字符流
BufferedReader br =new BufferedReader(isr);//为输入流添加缓冲区
String ifno =null;
while ((ifno= br.readLine())!=null) {
System.out.println("我客户端,服务器说"+ifno);
}pw.close();
os.close();
socket.close();
}
}