Socket-Java

本文介绍了Java中Socket的基本使用,包括创建Socket、获取输入输出流、进行数据交换及关闭连接的方法。通过示例展示了Server如何监听并接受Client的连接请求,以及双方如何通过输入输出流进行数据交互。此外,还提供了一个多线程Server的例子,以处理多个并发连接。
摘要由CSDN通过智能技术生成

Socket

前言

Socket是网络上运行的两个程序建双向通信的一端,它既可以接收请求,也可以发送请求,用它可以比较方便的在网络上传递数据,其中java中有关socket的常用方法如下:

方法名功能说明
public Socket(String host,int port)创建一个到主机host、端口为port的套接字,并连接到远程主机
public Socket(InetAddress host,int port)创建一个套接字,使用host中封装的主机信息,端口号为port,并连接到主机
public InetAddress getInetAddress()返回连接到远程主机的地址,如果连接失败则返回以前连接的主机
public int getPort()返回Socket连接到远程主机的端口号
public int getLocalPort()返回本地连接终端的端口号
public InputStream getInputStream()获取输入流,利用这个流就可以从套接字中读取数据
public OutputStream getOutputStream()获取输出流,可以在应用程序中写数据到套接字的另一端
public synchronized void close()关闭套接字

Socket的C\S基本过程如下:

  • Server监听某个端口是否有连接请求
  • Client向Server发出连接请求
  • Server向Client接收消息并建立连接
  • 通过getInputStream()和getOutputStream(),Server与Client双向读写
  • 关闭Server和Client的Socket

Socket的基本使用流程:

  • 根据指定地址和端口创建一个Socket对象
  • 调用getInputStream()或getOutputStream()打开连接到Socket的输入\输出流
  • 客户端与服务器根据一定的协议交互,知道关闭连接
  • 关闭客户端的Socket

上一套代码参考

最基本的一套

Server:

package TestThread;

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

public class Server{
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		BufferedReader in = null;
		PrintWriter out = null;
		try {
			serverSocket = new ServerSocket(1210);
			System.out.println("Server start....");
			socket = serverSocket.accept();
			in =new BufferedReader(new InputStreamReader(socket.getInputStream()));
			System.out.println("客户端传递的消息:"+in.readLine());
			out=new PrintWriter(socket.getOutputStream());
			out.println("服务端发送消息!");
			out.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				in.close();
				out.close();
				socket.close();
				serverSocket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}

Client:

package TestThread;

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

public class Client {
	public static void main(String[] args) {
		PrintWriter out=null;
		BufferedReader in=null;
		Socket socket=null;
		try {
			socket = new Socket("127.0.0.1",1210);
			out =new PrintWriter(socket.getOutputStream());

			out.println("大家好,这里是Socket客户端");
	
			out.flush();
			in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
			System.out.println(in.readLine());
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				in.close();
				out.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

多线程的Server:

package TestThread;

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

public class Server2 extends Thread{
	ServerSocket soc;
	Server2(){
		try {
			soc = new ServerSocket(1210);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//启动服务器线程
		this.start();
		System.out.println("Server多线程接收开启....");
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("开启线程");
		Socket socket = null;
		BufferedReader in = null;
		PrintWriter out = null;
		while(this.isAlive()) {
			try {
				//接收一个套接字
				socket = soc.accept();
				//创建一个从套接字重读数据的管道,即输入流,读取客户信息
				in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				System.out.println(in.readLine());
				//创建一个往套接字中写数据的管道,即输出流,给客户发送返回信息
				out = new PrintWriter(socket.getOutputStream());
				out.println("你好,ServerSocket服务器已收到!");
				out.flush();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {

				try {
						if(in != null) {
							in.close();
						}
						if(out != null) {
							out.close();
						}
						if(socket != null) {
							socket.close();
						}
						
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}

		}
	}
public static void main(String[] args) {
	new Server2();
}
}

ServerSocket

一般情况下,Server的基本工作步骤如下:

  • 根据指定端口创建一个新的ServerSocket对象
  • 调用ServerSocket的accept()在指定端口监听到来的连接请求,accept()一直处于阻塞状态,直到有client试图建立连接,这时accept()返回连接客户端与服务端的Socket对象
  • 调用getInputStream()或getOutputStream()来建立与客户端交互的输入\输出流
  • 关闭服务器端的Socekt
  • 返回(2)监听下一次连接
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值