您的位置:首页 > 编程语言 > Java开发

JAVA Socket 编程学习

2017-09-28 20:59 302 查看
简介:

   下面是我在慕课上听完JAVA Socket课程后的学习总结,需要的小伙伴可以看下。

工具:IntelliJ IDEA

1. Socket 通信
  Java Socket 实现客户端--服务器间的双向实时通信。java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端。

                


2. Socket 通信实现方法
   2.1  服务器端(非多线程) 
     ① 创建ServerSocket对象,绑定监听端口

     ② 通过accept()方法监听客户端请求

     ③ 连接建立后,通过输入流读取客户端发送的请求信息

     ④ 通过输出流向客户端发送相应信息

     ⑤ 关闭相关资源

代码实现类:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 基于TCP 协议的Socket通信,实现用户登录
* 服务器端
* Created by Administrator on 2017/9/28.
*/
public class TestServerSocket  {
public static void main(String[] args) {

ServerSocket serverSocket= null;
Socket socket=null;
try {
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
serverSocket = new ServerSocket(8888);
System.out.println("***服务器即将启动,等待客户端的连接");

//2、调用accept()方法开始监听,等待客户端的连接
socket=serverSocket.accept();

//3、获取输入流,并读取客户端信息
InputStream inputStream=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
String data=null;
while((data=br.readLine())!=null)
{
System.out.println("我是服务器,客户端说:"+data);
}

socket.shutdownInput();//关闭输入流

//4、获取输出流,响应客户端的请求
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("欢迎你!");
pw.flush();

//关闭资源
pw.close();
os.close();

br.close();
inputStream.close();
socket.close();
serverSocket.close();

} catch (IOException e) {

4000
e.printStackTrace();
}

}
}

         
   2.2  客户端

  

    ① 创建Socket对象,指明需要连接的服务器的地址和端口号

    ② 连接建立后,通过输出流想服务器端发送请求信息

    ③ 通过输入流获取服务器响应的信息

    ④ 关闭响应资源

代码实现类:

import java.io.*;
import java.net.Socket;

/**
* 客户端
* Created by Administrator on 2017/9/28.
*/
public class TestSocket {
public static void main(String[] args) {

try {
//1、创建客户端Socket,指定服务器地址和端口
Socket socket=new Socket("localhost",8888);

//2、获取输出流,向服务器端发送信息
OutputStream outputStream=socket.getOutputStream();
PrintWriter pw=new PrintWriter(outputStream);
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownInput();

//3、获取输入流,并读取服务器端的响应信息
InputStream inputStream=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
String data=null;
while((data=br.readLine())!=null)
{
System.out.println("我是客户端,服务器说:"+data);
}

//关闭资源
br.close();
inputStream.close();

pw.close();
outputStream.close();
socket.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}


3.应用多线程实现服务器与多客户端之间的通信
    
   3.1新建服务器端线程处理类
    
import java.io.*;
import java.net.Socket;

/**
* 服务器端线程处理类
* Created by Administrator on 2017/9/28.
*/
public class ServerThread extends Thread {

//和本线程相关的socket
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
//服务器处理代码
//3、获取输入流,并读取客户端信息
InputStream inputStream = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
try {
inputStream = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String data = null;
while ((data = br.readLine()) != null) {
System.out.println("我是服务器,客户端说:" + data);
}

socket.shutdownInput();//关闭输入流

//4、获取输出流,响应客户端的请求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎你!");
pw.flush();

} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
try {
if (pw != null) {
pw.close();
}
if (os != null) {
os.close();
}

if (br != null) {
br.close();
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


  

      3.2 服务器端 (多线程)

  
  ①服务器端创建ServerSocket,循环调用accept()等待客户端连接
     ②客户端创建一个socket并请求和服务器端连接
     ③服务器端接受客户端请求,创建socket与该客户建立专线连接

     ④ 建立连接的两个socket在一个单独的线程上对话

     ⑤ 服务器端继续等待新的连接 

代码实现类:

   
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器端(多线程)
* Created by Administrator on 2017/9/28.
*/
public class ThreadServerSocket {
public static void main(String[] args) {

try {
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;

//记录客户端的数量
int count = 0;
System.out.println("***服务器即将启动,等待客户端的连接");
//循环监听等待客户端的连接
while (true) {
//调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
//启动线程
serverThread.start();
count++;
System.out.println("客户端连接的数量:" + count);
//获取当前客户端的IP地址
InetAddress address=socket.getInetAddress();
System.out.println("当前客户端的IP:"+address.getHostAddress());
}

} catch (IOException e) {
e.printStackTrace();
}
}
}


    

  
               
                        
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息