第一步 充分理解Socket
1.什么是socket
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
重要的Socket API:
java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。
. Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
. getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。
. getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
2.如何开发一个Server-Client模型的程序
开发原理:
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
{建立服务器}
package com.socket;
import java.net.*;
import java.io.*;
public class Server{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private int count = 0;
public Server(){
try{
ss = new ServerSocket(10000);
System.out.println("server stared:");
while (true){
socket = ss.accept();
System.out.println("Client" + ++count +" connection:");
in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
String line = null;
while((line=in.readLine()) != "bye"){
System.out.println("Client say:"+line);
out.println("you input is :" + line);
}
}
}catch (IOException e){
e.printStackTrace();
System.out.println("Server Error!");
}finally{
if(out != null){
out.close();
}
try {
if(in != null){
in.close();
}
if(socket != null){
socket.close();
}
if(ss != null){
ss.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
new Server();
}
}
这个客户端连接到地址为xxx.xxx.xxx.xxx的服务器,端口为10000,并从键盘输入一行信息,发送到服务器,然后接受服务器的返回信息,最后结束会话。
第二步 多个客户同时连接
在实际的网络环境里,同一时间只对一个用户服务是不可行的。一个优秀的网络服务程序除了能处理用户的输入信息,还必须能够同时响应多个客户端的连接请求。在java中,实现以上功能特点是非常容易的。
设计原理:
主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。
{实现消息共享}
package com.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer extends ServerSocket {
private static final int SERVER_PORT = 10000;
private static int clientCount = 1;
public SocketServer() throws IOException {
super(SERVER_PORT);
System.out.println("Server is staring:");
try{
while (true)
{
Socket socket = accept();
new CreateServerThread(socket);
clientCount++;
}
}catch (IOException e){
e.printStackTrace();
System.out.println("SocketServer exception");
}finally{
close();
}
}
// --- CreateServerThread
class CreateServerThread extends Thread{
private Socket client;
private BufferedReader in;
private PrintWriter out;
private int count;
public CreateServerThread(Socket s) throws IOException {
client = s;
count = clientCount;
in = new BufferedReader(new InputStreamReader(client
.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
System.out.println("--- Welcome client"+clientCount+"---");
start();
}
public void run(){
try{
String line = null;
while (!(line=in.readLine()).equals("bye")){
String msg = createMessage(line);
out.println(msg);
System.out.println(msg);
//line = in.readLine();
}
}catch (IOException e){
e.printStackTrace();
}finally{
out.println("--- See you, bye! ---");
try {
if(client != null){
client.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private String createMessage(String line) throws UnsupportedEncodingException{
return "client"+count + " say:"+line;//new String(line.getBytes("ISO-8859-1"),"GB2312");
}
}
public static void main(String[] args) throws IOException{
new SocketServer();
}
}
分享到:
相关推荐
java socket 编程,Java socket 编程实例,对于初学者是一个非常好的东西,对于有过经验的是非常好的更深了解的东西,希望大家共同进步
Java socket编程实例.pdf
java大学教程源码中关于socket编程的三个实例
java socket 实现简单的客户端和服务端通信
java socket编程实例,各种实例打包
Java socket编程实例代码,文章讲解可以参考我的blog
android socket 编程实例 客户端是android应用程序, socket服务器端使用java作为服务器
java socket网络编程,包括服务与客户端,多线程支持多客户端同时在线。
java Socket编程实例 包括客户端代码和服务器端代码。
用JAVA实现的文件上传,控制台输入,保存到数据库
java网络编程实例,对网络编程的基础知识的探究
主要讲解Java Socket编程中TCP服务端线程池的实例,希望能给大家做一个参考。
Java Socket网络编程实例.pdf 学习资料 复习资料 教学资源
Java网络编程的小例子,分服务器端和客户端,可以相互通信,有注释!
网络组建与实施、SOCKET编程(包括MFC SOCKET编程和JAVA SOCKET编程)等编程实例
java socket编程,讲解其原理和编程的过程,并有相关的实例。
java socket 的长连接实例,服务器端支持多个客户端连接,服务器端支持客户端的掉线检测。多线程编程
三步学会Java Socket编程 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 以J2SDK-1.3为例,Socket和ServerSocket...
主要讲解Java Socket编程中TCP的基本使用,希望能给大家做一个参考。
计算机网络 作业实例 Java socket编程 文件传输