`
taote
  • 浏览: 33953 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多
之前一直与网站打交道,知道点通过浏览器等遵循http等协议进行网络通信,但是对于2台计算机之间的通信一直不是很明白,这几天温习了Java中的socket编程(中文“套接字”),Java中的java.net包对网络连接的低层做了很好的处理,我们在进行通信处理也是较为简单。
一、工作方式
1.服务器应用程序对特定端口创建出ServerSocket

ServerSocket serverSock = new ServerSocket(4242);//这回让服务器应用程序开始监听来自4242端口客户端的请求

2.客户端对服务器应用程序建立Socket连接

Socket sock = new Socket("190.168.1.1",4242)//客户端得知道IP地址与端口号

3.服务器创建出与客户端通信的新Socket

Socket sock = serverSock.accept();//accept()方法会在等待用户的Socket连接时闲置着。监听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。当用户连上来时,此方法返回一个Socket(在不同的端口上)以便于客户端通信。Socket与ServerSocket的端口号不相同,因此ServerSocket可以空出来等待其他的用户。

二、
下面是一个简单的通信过程,服务端Myserver,当一次通话连接上时产生一个新的线程,与客户端进行通话,这里面便通过多线程实现了通话的同步,可以有多个客户端连上服务端,基本上上可以同时实现通信。
public class Myserver {

	public static ServerSocket myserver;

	public static void main(String[] args) {
		try {
			myserver = new ServerSocket(2222);
			while (true) {
	            Socket socket = myserver.accept();
				Thread t = new Thread(new ThreadSocket(socket));
				t.start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

服务端线程:
public class ThreadSocket implements Runnable {
	private Socket socket;

	ThreadSocket(Socket socket) {
		this.socket = socket;
	}

	public void run() {
		try {
			// 取得连接socket上低层输入串流的inputStreamReader,并用BufferedReader读取
			BufferedReader in = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			// 向串口输出流
			PrintWriter out = new PrintWriter(socket.getOutputStream());

			while (true) {
				String str = in.readLine();
				System.out.println("your input is :" + str);
				out.println("has receive...");
				out.flush();
				if (str.equals("end"))
					break;
			}
			in.close();
			out.close();
			socket.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

服务端接收客服端的输出,收到后打印出,然后发送"has receive..."回客户端。若从客户端接收到“end”,关闭输入输出流与通话。
public class Myclient {
	public Myclient() throws UnknownHostException, IOException {

		Socket client = new Socket(InetAddress.getLocalHost(), 2222);
		PrintWriter out = new PrintWriter(client.getOutputStream());
		// 客户端从键盘输入信息
		BufferedReader in1 = new BufferedReader(
				new InputStreamReader(System.in));
		// 客户端建立输入流并进行封装
		BufferedReader in2 = new BufferedReader(new InputStreamReader(client
				.getInputStream()));
		while (true) {
			String str1 = in1.readLine();
			
			out.write(str1+"\r\n");
			out.flush();
			if(str1.equals("end"))
				break;
			System.out.println(str1);
			String str2 = in2.readLine();
			System.out.println("str2:"+str2);
		}
		in1.close();
		in2.close();
		out.close();
		client.close();
	}

	public static void main(String[] args) throws UnknownHostException,
			IOException {
		new Myclient();
	}
}

注意客户端有2个输入端,一口监听键盘输入,一口监听socket输入(即服务端的输出),将键盘输入发送出去,同时若键盘输入"end",同样,关闭各流及连接。
注意:out.write(str1+"\r\n");在发送字符后加上"\r\n",因为我们读取的时候常用,readLine(),即从缓冲区中读取字符,知道遇到"\r"或"\n"为止,不加上的话接收方不能很好的读到,可能就会卡住。当然out.write(str1+"\r\n")也可以写作out.println(str1).
输出:
当我们在键盘上输入:Forza inter!
客户端控制台:
Forza Inter!
str2:has receive...

服务端控制台:
your input is :Forza Inter!

三、
现在通过多线程可以实现多人同时通话,不断的连接,不断的产生新的通话,新的线程。如果是一个大型的或者要求较高的实现可能会要求我们控制同时连接的通话数量。那样的话我们就可以通过建立线程池的方法来自动管理。
0
0
分享到:
评论

相关推荐

    java-socketcan

    Java SocketCAN是一个用于在Linux环境下通过Java编程语言与CAN(Controller Area Network)总线通信的库。这个库允许开发者在Java应用程序中实现低级别的CAN数据帧收发,从而无需深入理解底层操作系统或C/C++编程。...

    Java多线程-Socket编程

    Java 多线程-Socket 编程 Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口...

    基于Java--Socket-网络编程.doc

    基于Java--Socket-网络编程.doc

    Java TCP-IP Socket编程-卡尔弗特.pdf

    本资料“Java TCP-IP Socket编程-卡尔弗特.pdf”旨在深入探讨如何利用Java语言进行TCP/IP套接字编程,构建稳定、高效的数据传输通道。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,而...

    Java面试之Socket编程

    Java网络编程是开发分布式应用程序的关键技术之一,其中Socket编程扮演着至关重要的角色。在Java面试中,对Socket编程的理解和应用能力通常是评估开发者技能的重要标准。以下是对Socket编程的详细阐述: 1. **Java ...

    Java-Socket编程

    Java Socket编程是Java网络编程的重要组成部分,它提供了一种在两个网络应用程序之间建立连接和交换数据的方法。在本文中,我们将深入探讨Java Socket编程的概念、原理以及如何使用它来实现客户端-服务器通信。 ...

    java-socket连接nodejs-socket

    Socket编程是一种基础的网络通信机制,允许两个应用程序通过网络交换数据。 首先,让我们深入了解一下Java中的Socket。在Java中,Socket是`java.net.Socket`类的一个实例,它代表了TCP协议中的一个连接。创建Socket...

    java-socket网络编程(tcp)

    在Socket编程中,必须妥善处理各种网络异常,如`IOException`,确保程序的健壮性。例如,当网络中断或服务器关闭时,需要捕获并适当地处理异常。 7. **阻塞与非阻塞模式** 默认情况下,Socket和ServerSocket操作...

    Java Socket网络编程.pdf

    在Java中,Socket编程主要涉及两个关键类:`ServerSocket`和`Socket`。`ServerSocket`类用于服务器端,它监听指定端口的连接请求。创建一个`ServerSocket`实例,例如`ServerSocket server = new ServerSocket(9998);...

    Java-network-socket-programming.zip_java programming_java socket

    本文将深入探讨Java的Socket编程,包括基础知识、API使用、常见问题及解决策略。 一、Java Socket概述 Java Socket是Java提供的网络通信接口,允许两台机器上的应用程序通过TCP/IP协议进行双向通信。Socket建立在...

    超市收银管理系统---基于socket网络编程(北大青鸟第一单元)

    1. **TCP/IP协议**:socket编程基于TCP/IP协议栈,理解TCP的三次握手和四次挥手过程以及其可靠性的保证对实现稳定的数据传输至关重要。 2. **套接字创建与连接**:在Python或Java等编程语言中,需要使用特定的API...

    JavaTCP-Socket.zip_JAVA socket编程_java socket _socket 聊天

    本篇将深入探讨Java Socket编程及其在构建聊天应用中的应用。 首先,我们要了解TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保数据包按照顺序发送,并且在接收端按顺序接收,...

    java编程-socket-套接字-网络编程.docx

    Socket编程是Java网络编程的核心技术之一,主要用于实现不同计算机之间的通信。通过Socket,应用程序可以在网络上发送和接收数据,实现分布式系统的构建。 #### 二、Socket编程基本概念 - **Socket**:在网络编程...

    华科-计算机网络实验报告-Java_Socket编程-网络组建实验.docx

    "华科-计算机网络实验报告-Java_Socket编程-网络组建实验.docx" 这份实验报告主要涵盖了计算机网络实验的两个部分:Socket 编程和网络组建实验。下面是对这两部分的详细解释和知识点总结: Socket 编程 Socket ...

    c++--java,socket.zip

    C++和Java都是支持Socket编程的常用编程语言。在C++中,我们可以使用`<sys/socket.h>`和`<netinet/in.h>`等头文件来创建和操作Socket;而在Java中,`java.net.Socket`和`java.net.ServerSocket`类提供了相应的功能。...

    java -> TCP/UDP 连接测试 SocketTest

    下面我们将详细探讨TCP和UDP的特点、Java中的Socket编程以及如何进行连接测试。 TCP是一种面向连接的、可靠的传输协议,它确保了数据的完整性和顺序性。在TCP通信中,数据在发送前会建立连接,并且在接收方会按照...

    JAVA网络编程资料(1)-Socket套接字—Java套接字编程.chm

    JAVA网络编程资料(1)-Socket套接字—Java套接字编程.chm

    java文件传输----socket

    本篇主要介绍Java中的Socket编程,特别是如何利用Socket进行文件传输。 首先,理解Socket的基本概念。Socket可以被视为网络上的一个端点,它允许两个程序通过网络进行通信。在Java中,`java.net.Socket`类代表...

Global site tag (gtag.js) - Google Analytics