前段时间用Java写了点网络编程,写几篇博客纪念一下。。。
本文参考:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
其中关于网编的基础内容,讲解的很好!
什么是Socket?
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。
Socket通常用来实现客户方和服务方的连接。
Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
Socket通讯的过程
Server端Listen(监听)某个端口是否有连接请求;
Client端向Server 端发出Connect(连接)请求;
Server端向Client端发回Accept(接受)消息;
Server端和Client 端通过Send,Write等方法与对方通信。
基本的步骤
创建Socket;
打开连接到Socket的输入/出流;
按照一定的协议对Socket进行读/写操作;
关闭Socket。
习惯性的写Demo:
先看Server端:
package me.hello.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* God Bless You!
* Author: Fangniude
* Date: 2013-07-15
*/
public class AncientServer {
public static void main(String args[]) {
try {
ServerSocket server = null;
try {
server = new ServerSocket(4700); //创建一个ServerSocket在端口4700监听客户请求
} catch (Exception e) {
System.out.println("can not listen to:" + e);//出错,打印出错信息
}
Socket socket = null;
try {
System.out.println("Server已经启动,监听端口: " + server.getLocalPort() + ", 等待客户端注册。。。");
socket = server.accept();//使用accept()阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行
System.out.println("有一个客户端注册上来了。。。");
System.out.println("Client:" + socket.getRemoteSocketAddress());
System.out.println("Server IP:" + socket.getLocalAddress() + ", Port:" + socket.getLocalPort());
} catch (Exception e) {
System.out.println("Error." + e); //出错,打印出错信息
}
String line;
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));//由Socket对象得到输入流,并构造相应的BufferedReader对象
PrintWriter os = new PrintWriter(socket.getOutputStream());//由Socket对象得到输出流,并构造PrintWriter对象
System.out.println("\n等待客户端输入。。。");
line = is.readLine();//从标准输入读入一字符串
while (!line.equals("bye")) {//如果该字符串为 "bye",则停止循环
System.out.println("Client发来:" + line);
os.println("Server已收到刚发送的:" + line); //向客户端输出该
os.flush();//刷新输出流,使Client马上收到该字符串
System.out.println("\n等待客户端输入。。。");
line = is.readLine(); //从系统标准输入读入一字符串
} //继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
server.close(); //关闭ServerSocket
} catch (Exception e) {
System.out.println("Error:" + e);//出错,打印出错信息
}
}
}
来看看客户端:
package me.hello.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* God Bless You!
* Author: Fangniude
* Date: 2013-07-15
*/
public class AncientClient {
public static void main(String args[]) {
try {
Socket socket = new Socket("127.0.0.1", 4700); //向本机的4700端口发出客户请求
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in)); //由系统标准输入设备构造BufferedReader对象
PrintWriter os = new PrintWriter(socket.getOutputStream()); //由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); //由Socket对象得到输入流,并构造相应的BufferedReader对象
System.out.println("已经与Server建立连接。。。。");
System.out.println("\n请输入要发送的信息:");
String readline = sin.readLine(); //从系统标准输入读入一字符串
while (!readline.equals("bye")) { //若从标准输入读入的字符串为 "bye"则停止循环
os.println(readline); //将从系统标准输入读入的字符串输出到Server
os.flush(); //刷新输出流,使Server马上收到该字符串
System.out.println(is.readLine()); //从Server读入一字符串,并打印到标准输出上
System.out.println("\n请输入要发送的信息:");
readline = sin.readLine(); //从系统标准输入读入一字符串
} //继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
} catch (Exception e) {
System.out.println("Error" + e); //出错,则打印出错信息
}
}
}