浅出Java Socket 编程
前言:本文转自http://dev.csdn.net/develop/article/27/27115.shtm,其中个别地方加入了笔者的个人见解。
出于多种目的要写这篇文章,简单的说是因为最近的工作和Java 的Socket相关.所以工作之余就有了写点东西的想法.同样我不希望把文章写的太复杂,因此浅出自己的一点心得.
事 实上网络编程简单的理解就是两台计算机相互通讯数据而已.对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了.Java SDK提供一些相对简单的Api来完成这些工作.Socket就是其中之一.对于Java而言.这些Api存在于java.net 这个包里面.因此只要导入这个包就可以准备网络编程了.
网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中 一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系..然后完成数据的通讯就可以了.这里提供固定位置的通常称为 服务器,而建立联系的通常叫做客户端.基于这个简单的模型,就可以进入网络编程啦.
Java对这个模型的支持有很多种Api,而这里我只想介绍有 关Socket的编程接口。对于Java而言已经简化了Socket的编程接口.首先我们来讨论有关提供固定位置的服务方是如何建立的。Java提供了 ServerSocket来对其进行支持.事实上当你创建该类的一个实例对象并提供一个端口资源你就建立了一个固定位置,可以让其他计算机来访问你了。 ServerSocket server=new ServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的,因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从 0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的.好了.我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求.因此 Java同样提供了一个Socket对象来对其进行支持.只要客户方创建一个Socket的实例对象进行支持就可以了.Socket client=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址.对于着一点Java也提供了一 个相关的类InetAddress,该对象的实例必须通过它的静态方法来提供.它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。
好了,上面的方法基本可以建立一条连线让两台计算机相互交流了.可是数据是如何传输的 呢?事实上I/O操作总是和网络编程息息相关的.因为底层的网络是基于数据的.除非远程调用,处理问题的核心在执行上.否则数据的交互还是依赖于I\O操 作的.所以你也必须导入java.io这个包.java的IO操作也不复杂.它提供了针对于字节流Unicode的读操作和写操作,然后也提供了一个用于缓冲数据的读写.
BufferedReaderin=newBufferedReader(newInputStreamReader(server.getInputStream()));
PrintWriterout=newPrintWriter(server.getOutputStream());
上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作.而原始的字节流来源于Socket的两个方法.getInputStream ()和getOutputStream()方法,分别用来得到输入和输出.那么现在有了基本的模型和基本的操作工具.我们可以做一个简单的Socket例程 了.
服务方:
packagechb.socket;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassMyServer...{
publicstaticvoidmain(String[]args)throwsIOException...{
ServerSocketserver=newServerSocket(5678);
Socketclient=server.accept();
BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));//得到客户端传过来的stream
PrintWriterout=newPrintWriter(client.getOutputStream());
while(true)...{
Stringstr=in.readLine();
System.out.println(str);
out.println("hasreceive....");
out.flush();
if(str.equals("end"))
break;
}
client.close();
}
}
这个程序的主要目的在于服务器不断接收客户机所写入的信息只到.客户机发送"End"字符串就退出程序.并且服务器也会做出"Receive"为回应.告知客户机已接收到消息.
客户端:
packagechb.socket;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.InetAddress;
importjava.net.Socket;
importjava.net.UnknownHostException;
publicclassClient...{
staticSocketserver;
publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException...{
server=newSocket(InetAddress.getLocalHost(),5678);
BufferedReaderin=newBufferedReader(newInputStreamReader(server.getInputStream()));
PrintWriterout=newPrintWriter(server.getOutputStream());
BufferedReaderwt=newBufferedReader(newInputStreamReader(System.in));
while(true)...{
Stringstr=wt.readLine();
out.println(str);
out.flush();
if(str.equals("end"))...{
break;
}
System.out.println(in.readLine());
}
server.close();
}
}
客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识.
这个程序只是简单的两台计算机之间的通讯.如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的.那么多个客户端如何实现呢?
其实,简单的分析一下,就可以看出客户端和服务器通讯的主要通道就是Socket本身.而服务器通过accept方法就是同意和客户建立通讯.这样当客 户建立Socket的同时.服务器也会使用这一根连线来进行通讯.那么既然如此只要我们存在多条连线就可以了.那么我们的程序可以变为如下:
服务器:
packagechb.socket;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassMyServer...{
publicstaticvoidmain(String[]args)throwsIOException...{
ServerSocketserver=newServerSocket(5678);
while(true)...{
Socketclient=server.accept();
BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
PrintWriterout=newPrintWriter(client.getOutputStream());
while(true)...{
Stringstr=in.readLine();
System.out.println(str);
out.println("hasreceive....");
out.flush();
if(str.equals("end"))
break;
}
client.close();
}
}
}
这里仅仅只是加了一个外层的While 循环.这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息.那么现 在就实现了多客户之间的交互了.但是.问题又来了.这样做虽然解决了多客户,可是是排队执行的.也就是说当一个客户和服务器完成一次通讯之后下一个客户才 可以进来和服务器交互.无法做到同时服务.那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了.所以线程是最好的解 决方案.
那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系.然后由线程来执行刚才的操作.要创建线程要么 直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法.而run方法 所做的事情,就是刚才单线程版本main所做的事情.因此我们的程序变成了这样:
服务器:
packagechb.socket;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassMultiUserextendsThread...{
privateSocketclient;
publicMultiUser(Socketc)...{
this.client=c;
}
publicvoidrun()...{
try...{
BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
PrintWriterout=newPrintWriter(client.getOutputStream());
//MutilUserbutcan'tparallel
while(true)...{
Stringstr=in.readLine();
System.out.println(str);
out.println("hasreceive....");
out.flush();
if(str.equals("end"))
break;
}
client.close();
}catch(IOExceptionex)...{
}finally...{
}
}
publicstaticvoidmain(String[]args)throwsIOException...{
ServerSocketserver=newServerSocket(5678);
while(true)...{
//transferlocationchangeSingleUserorMultiUser
MultiUsermu=newMultiUser(server.accept());
mu.start();
}
}
}
我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系.这样每个线程就有了一个通讯管道.同样我们可以填写run方法.把之前的操作交给线程来完成.这样多客户并行的Socket就建立起来了.
我的文章写完了.虽然我的文章到这里就结束了.可是要和Java的Socket相关的操作还有很多.各位大侠继续努力吧....
分享到:
相关推荐
本教程将深入浅出地探讨Java Socket编程的核心概念和技术,帮助开发者理解如何构建可靠的网络应用程序。 一、Socket概述 Socket,通常被称为套接字,是网络通信中的一个抽象接口,它允许两个运行在不同设备上的应用...
在Java中,Socket编程主要涉及两个关键类:`ServerSocket`和`Socket`。`ServerSocket`类用于服务器端,它监听指定端口的连接请求。创建一个`ServerSocket`实例,例如`ServerSocket server = new ServerSocket(9998);...
Java Socket 编程实现两台主机间的通信 Java Socket 编程是 Java 语言中用于实现网络通信的编程技术。通过使用 Socket 编程,可以实现两台主机之间的通信,实现数据的传输和交换。本文将详细介绍 Java Socket 编程...
在Java中,Socket编程主要是基于TCP/IP协议的网络编程。 网络编程的两个主要问题 在网络编程中,有两个主要的问题需要解决:一是如何准确地定位网络上的一台或多台主机,二是找到主机后如何可靠高效地进行数据传输...
Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信连接的能力。在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库...
Java Socket编程是Java平台中用于实现网络通信的核心API,它基于TCP/IP协议栈,提供了低级别的、面向连接的、可靠的字节流通信。在本文中,我们将深入探讨Java Socket编程的关键概念、工作原理以及如何创建服务端和...
Socket 编程在 Java 中主要依赖于 `java.net` 包中的 `Socket` 和 `ServerSocket` 类。`ServerSocket` 类通常用于服务器端,它监听特定端口的连接请求,当有客户端发起连接时,服务器会创建一个 `Socket` 对象与...
java socket编程 java网络编程 课件 java socket编程 java网络编程 课件
### Java Socket编程详解及实例分析 #### 一、Socket编程基础概述 在计算机网络通信领域,Socket编程是一种广泛使用的通信方式。它为不同主机上的进程提供了双向通信的能力,是网络编程的基础之一。Java语言提供了...
《Java TCP/IP Socket编程(原书第2版)》基于TCP/IP Socket相关原理,对如何在Java中进行Socket编程作了深入浅出的介绍。《Java TCP/IP Socket编程(原书第2版)》内容简明扼要,条理清晰,并在讲解相应的概念或编程...
本文将深入探讨Java Socket编程的基础知识、关键概念以及如何在实践中应用。 一、Socket概述 Socket,也被称为套接字,是网络通信的端点,可以理解为两个应用程序之间的连接通道。在Java中,Socket类(java.net....
Java Socket编程是Java网络编程的重要组成部分,主要用于实现客户端与服务器之间的通信。在本文中,我们将深入探讨Java Socket编程的基础知识,以及如何结合HTML进行交互。 首先,Java Socket是TCP/IP协议族的一...
在Java中,Socket编程是实现网络通信的基础,它提供了进程间通信的能力,使得两个相隔万里的计算机可以通过互联网进行数据交换。本篇文章将深入讲解如何通过三步学习Java Socket编程。 **第一步:理解Socket** ...
Java Socket编程是网络编程中的重要组成部分,主要用于实现客户端与服务器之间的通信。在Java中,Socket是基于TCP协议的,提供了一种可靠的、基于字节流的双向通信方式。本资料包含的"Java源码:Socket编程"是一个...
Java的Socket编程是Java网络编程的核心部分,它提供了在TCP/IP协议栈上进行通信的机制。Socket接口是对TCP/IP协议的抽象,使得开发者能够轻松地创建客户端和服务器应用程序,实现网络上的数据交换。在这个主题中,...
本教程将深入探讨Java Socket编程的核心概念,以及如何利用它进行网络通信。 1. **Java Socket基础** - **Socket的概念**:Socket是网络通信中的一个端点,可以理解为两台机器间通信的桥梁。在Java中,Socket类...
Java Socket编程是Java网络编程的核心部分,主要用于实现客户端与服务器之间的通信。在TCP/IP协议族中,IP层主要处理主机的定位和数据路由,而TCP和UDP层则提供了数据传输的机制。Java Socket编程主要涉及TCP和UDP这...
Java Socket编程是网络编程的基础,它提供了在Java中进行低级网络通信的接口。Socket是TCP/IP协议族的一部分,用于实现客户端与服务器之间的双向通信。在这个"java TCP_IP Socket 编程"源码中,我们可以深入理解...
在Java中,我们可以使用`java.net.Socket`类和`java.net.ServerSocket`类来实现TCP Socket编程。`ServerSocket`用于监听客户端的连接请求,`Socket`则代表一个客户端连接。以下是一个简单的TCP服务器端和客户端示例...
import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class Server extends ServerSocket { private static ArrayList User_List = new ArrayList(); private static ...