`
greemranqq
  • 浏览: 975818 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Socket 服务器和客户端连接

阅读更多

这2天,看了看网路编程,这里记录一下自己的理解。

网络编程,简单的理解,就是通讯,这里说服务器和客户端的通讯。服务器一直监听着,看是不是有客户来访问。

服务器:相当于一个家,或者一个定点买东西的地方,肯定是需要地址的,不然别人找不到地方对吧。

JAVA 体面提供了InetAddress 对象,通过getByName 等方法,可以获取地址(住址名称)的。

 

客户端:客户嘛,大家都明白,就是要去和服务器进行回话,相当于我要和你联系,需要你家住址(起码要电话号码之类的,才能找到你)。

 

地址和端口:地址就不说了,就是能确定你位置一个东东。因为一台服务器,可能有很多服务,这里需要用端口来区分。好比:我到你家买东西,8080 这个端口卖饼干,8081 端口可以卖水果等等。

 

交互:我作为客户,想到你家买东西,那么我肯定要知道你家地址,我只买饼干,那么我还要知道你家饼干的端口8080.你作为服务器,也就是卖住,你不知道什么人来买,因此你只需要将卖饼干 和买水果的端口打开,派人看着(监听)就行。

 

JAVA 给我们节省了很多,对于服务器,只需要用ServerSocket 监听端口,有人访问之后有accept()进行允许就行了。对于客户,要用Socket 传入地址(Address) 和端口(PORT)知道你 去哪,买什么。

 

当然,两边都有了, 当我有地址 有 端口,对你进行访问的时候,肯定得有通道吧,以前可以走路 坐车。现在起码也要卫星信号,才能电话连接对吧。JAVA 这里用了InputStream 和OutputStream ,可以用(Reader 和Writer),通过getInputStream (),getOutputStream ().获得,这就是双方的一个联系通道。

 

下面我来看看一个简单的程序:

     Server 服务器端:

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


public class MyServer {
	public static final int PORT = 8080;
	public static void main(String[] args) throws IOException, InterruptedException {
			// 服务器现监听一个端口
			ServerSocket ss = new ServerSocket(PORT);
			// 如果同一人访问,就给他开门
			Socket s = ss.accept();
			try{
				// 获取双方的传输通道
				BufferedReader in = new BufferedReader(
						new InputStreamReader(
								s.getInputStream()));
				
				// 这里注意  有个true,表示自动刷新缓冲区
				// 如果没有这个,他们就会一直等待信息,没有一行信息就无法进行下面的操作,一直会等到缓冲区满
				// 因此用刷新功能,将信息通过网络发送出去,客户端那边一样,信息需要通过网络交互
				PrintWriter out = new PrintWriter(
						new OutputStreamWriter(
								s.getOutputStream()),true);

				while(true){
					// 获取客户端来的消息,"END" 就退出
					String str = in.readLine();
					if("END".equals(str)){
						break;
					}
					System.out.println("str is :"+str);
					out.println(str);
					Thread.currentThread().sleep(1000);
				}
			}finally{
				// 这里为了节省资源,都关闭
				s.close();
				ss.close();
			}
	}
}

 

Client 客户端:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class MyClient {

	public static void main(String[] args) throws IOException {
		// 地址,null 表示本地127.0.0.1
		InetAddress addr = InetAddress.getByName(null);
		// 需要的端口
		Socket socket = new Socket(addr, 8080);
		try {
			System.out.println("socket = " + socket);
			BufferedReader in = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			// 自动刷新
			PrintWriter out = new PrintWriter(new BufferedWriter(
					new OutputStreamWriter(socket.getOutputStream())),true);
			// 我假设 说十句话
			for (int i = 0; i < 10; i++) {
				out.println("hello :" + i);
				String str = in.readLine();
				System.out.println(str);
			}
			out.println("END");
		} finally {
			socket.close();
		}

	}

}

 

 那么同理,我们只需修改一点,就可以完成多个客户端的访问,当然不是并发,这里用了点线程

   服务器端线程

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

public class ServerThread extends Thread {
	private Socket socket;
	private BufferedReader in;
	private PrintWriter out;

	// 服务器端的构造器,需要套接字socket
	public ServerThread(Socket s) throws IOException {
		socket = s;
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

		out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),
				true);
		// 启动run 
		start();
	}

	public void run() {
		String str;
		try {
			while (true) {
				str = in.readLine();
				if ("END".equals(str)) {
					break;
				}
				System.out.println("Str is :" + str);
				out.println(str);
			}
			System.out.println("closing...");
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

 

客户端线程

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class ClientThread extends Thread {
	private Socket socket;
	private BufferedReader in;
	private PrintWriter out;

	private static int counter = 0;
	private int id = counter++;
	private static int threadcount = 0;

	public static int getThreadCount() {
		return threadcount;
	}
	// 客户端的构造,需要地址
	public ClientThread(InetAddress addr) {
		System.out.println("client is :" + id);
		threadcount++;

		try {
			socket = new Socket(addr, 8080);
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			in = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			out = new PrintWriter(new OutputStreamWriter(socket
					.getOutputStream()), true);
			start();
		} catch (IOException e) {
			try {
				socket.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
	}

	public void run() {
		try {
			for (int i = 0; i < 10; i++) {
				out.println("cliend is :" + id + ":" + i);
				String str;
				try {
					str = in.readLine();
					System.out.println(str);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			out.println("END");
		} finally {
			try {
				socket.close();
			} catch (IOException e) {
				threadcount--;
			}
		}
	}
}

 服务器监听,并创建新的

 

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MultiServer {
	static final int PORT = 8080;

	public static void main(String[] args) throws IOException {
		ServerSocket s = new ServerSocket(PORT);
		System.out.println("Server Started");
		try {
			while (true) {
				Socket socket = s.accept();
				try{
					// 每一个访问该端口的,都从新一个线程
					new ServerThread(socket);
				}catch (IOException e) {
					socket.close();
				} 
			}
		} finally{
			s.close();
		}
	}
}

 模拟多个客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class ClientThread extends Thread {
	private Socket socket;
	private BufferedReader in;
	private PrintWriter out;

	private static int counter = 0;
	private int id = counter++;
	private static int threadcount = 0;

	public static int getThreadCount() {
		return threadcount;
	}
	// 客户端的构造,需要地址
	public ClientThread(InetAddress addr) {
		System.out.println("client is :" + id);
		threadcount++;

		try {
			socket = new Socket(addr, 8080);
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			in = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			out = new PrintWriter(new OutputStreamWriter(socket
					.getOutputStream()), true);
			start();
		} catch (IOException e) {
			try {
				socket.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
	}

	public void run() {
		try {
			for (int i = 0; i < 10; i++) {
				out.println("cliend is :" + id + ":" + i);
				String str;
				try {
					str = in.readLine();
					System.out.println(str);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			out.println("END");
		} finally {
			try {
				socket.close();
			} catch (IOException e) {
				threadcount--;
			}
		}
	}
}

 小结:从代码上看,其实很简单,以前假设 我是到你家,8080端口去买东西 ,聊天什么的。现在有很多人去你家,同一个端口做事。因此每一个人都创建一个单独的线程,隔离出来就行了。

0
0
分享到:
评论

相关推荐

    Socket服务器和客户端

    Socket服务器是等待客户端连接并处理请求的程序。其工作流程大致如下: 1. 创建Socket:服务器首先创建一个ServerSocket对象,指定监听的端口号。 2. 监听连接:调用ServerSocket的accept()方法,进入阻塞状态,等待...

    C#高并发SOCKET服务器和客户端完整工程实例源码.zip

    本示例源码提供了C#语言实现的高并发SOCKET服务器和客户端的完整工程实例,这为开发者提供了学习和实践网络通信机制的机会。C#作为一种强大的.NET平台语言,拥有丰富的库支持,使得构建这样的系统变得相对简单。 ...

    Socket服务器与客户端编程(链表)

    总结一下,Socket服务器与客户端编程结合链表是一种常见的网络编程模式,特别是在处理并发连接时。通过链表,服务器可以高效地管理多个客户端连接,而Socket则提供了底层的通信机制。改端口可以根据实际需求调整...

    c++实现Socket服务器和客户端功能

    在这个项目中,我们将探讨如何使用C++在Visual Studio 2008环境下实现Socket服务器和客户端的基本功能。 首先,Socket在C++中主要是通过`&lt;winsock2.h&gt;`和`&lt;ws2tcpip.h&gt;`这两个库来使用的,它们提供了与操作系统底层...

    socket客户端,可连接多个服务器

    总的来说,这个"socket客户端,可连接多个服务器"的实现涉及了Socket编程的基础,TCP连接的建立与恢复,以及客户端的错误处理和重连策略。理解这些知识点对于开发分布式系统、网络应用或者其他需要网络通信的项目都...

    基于TCP的Socket编程服务器和客户端代码

    Java的`java.nio`包提供了非阻塞I/O的支持,可以同时处理多个客户端连接,提高了服务器的并发能力。 总结起来,基于TCP的Socket编程是构建网络应用的基础,涉及网络连接的建立、数据的可靠传输和通信链路的维护。...

    socket C# 服务器和客户端 图形界面

    Socket编程在IT领域中是网络通信的基础,尤其是在C#中,它提供了强大的工具来构建服务器和客户端应用程序。本文将深入探讨“socket C# 服务器和客户端 图形界面”这一主题,帮助你理解如何利用C#的Socket类创建交互...

    socket 服务器和客户端通讯

    在这个主题中,我们将深入探讨Socket服务器和客户端的异步通讯机制。 首先,我们需要理解什么是Socket。Socket是Internet上的进程间通信(IPC)的一种接口,它允许两个网络应用程序通过TCP/IP协议进行通信。在操作...

    socket服务器和客户端程序

    ### Socket服务器和客户端程序知识点详解 #### 一、Socket网络编程概述 Socket是网络通信的基础,它提供了一种进程间通信机制,允许不同计算机上的进程通过网络进行数据交换。在本例中,我们关注的是服务器端与...

    socket封装库,有服务器和客户端

    当客户端连接成功后,服务器端可以创建一个新的Socket与客户端进行通信,并可以接收和发送数据。 4. **客户端实现**:客户端首先需要建立到服务器的连接,通过指定服务器的IP地址和端口号发起连接请求。连接成功后...

    C# Socket 通信,客户端服务器端

    4. **接受连接**:当有客户端连接时,使用`Socket.Accept()`方法接收连接并返回一个新的Socket对象,用于与客户端进行数据交换。 5. **接收和发送数据**:通过`Socket.Receive()`和`Socket.Send()`方法进行数据的...

    简单的socket 服务器/客户端编程

    5. **接受连接**:当有客户端连接时,使用`accept()`方法接收连接请求,并返回一个新的套接字用于后续通信。 ```python client_socket, client_address = server_socket.accept() ``` 6. **接收和发送数据**:通过...

    Socket服务器和客户端通信

    在本文中,我们将深入探讨Socket服务器和客户端通信的基础知识,以及如何利用Socket进行网络通信。 首先,Socket是网络上的两个进程间通信的一种方式,它允许一台计算机(服务器)提供服务,另一台计算机(客户端)...

    MFC socket 服务器和客户端单文件demo

    总之,这个MFC Socket服务器和客户端的单文件Demo是一个很好的学习资源,它涵盖了Socket编程的基本要素,并提供了实践平台,对于希望掌握网络编程的开发者来说,是一份宝贵的资料。通过深入学习和实践,开发者可以更...

    C#Socket服务器与客户端交互

    这将阻塞直到有新的客户端连接,返回一个新的Socket对象用于与该客户端进行通信。 5. **数据传输**:通过新创建的Socket,服务器和客户端可以使用`Send()`和`Receive()`方法发送和接收数据。这两个方法都是阻塞的,...

    win Socket服务器与客户端

    本文将深入探讨“Win Socket服务器与客户端”的相关知识点,特别是涉及多线程技术的应用。 首先,我们需要理解Socket的基本概念。Socket是网络编程中的一个抽象概念,它代表了两个进程之间的通信链路。在TCP/IP协议...

    socket实现服务器和客户端数据的传输

    在"服务器客户端"的场景中,我们通常会有多个客户端同时连接到服务器。在这种情况下,服务器需要能够处理并发连接,这可能涉及到多线程或者异步I/O。对于C++,可以使用线程池或select/poll/epoll等I/O复用机制来处理...

    socket通信,客户端向服务器传文件

    - 当客户端连接后,`accept()`返回一个新的`Socket`对象,服务器可以通过这个Socket与客户端通信。 - 读取Socket的输入流(`InputStream`)来接收客户端发送的数据。 2. **客户端**: - 创建`Socket`实例,指定...

    简单的socket服务器端和客户端

    本示例将深入讲解如何创建一个简单的Socket服务器端和客户端,以帮助理解Java中的网络编程。 首先,我们要了解Socket的基本概念。Socket在计算机网络中扮演着桥梁的角色,它连接了服务器端应用程序和客户端应用程序...

Global site tag (gtag.js) - Google Analytics