java网络编程Socket学习(一)

                  

网路协议
应用层
DHCP · DNS · FTP · Gopher · HTTP· IMAP4 · IRC · NNTP · XMPP ·POP3 · SIP · SMTP · SNMP · SSH ·TELNET · RPC · RTCP · RTP ·RTSP· SDP · SOAP · GTP · STUN · NTP· SSDP · BGP · RIP 
传输层

TCP · UDP · TLS · DCCP · SCTP ·

RSVP · PPTP · OSPF 
网络层

IP (IPv4 · IPv6) · ICMP · ICMPv6· IGMP ·

IS-IS · IPsec · 
数据链路层

Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) ·ARP · RARP ·

ATM · DTM · 令牌环 · 以太网路 ·FDDI · 帧中继 · GPRS · EVDO ·HSPA · HDLC · PPP · L2TP · ISDN·STP 
物理层
以太网路 · 调制解调器 · 电力线通信(PLC) · SONET/SDH · G.709 · 光导纤维 · 同轴电缆 · 双绞线 

上面是维基百科上的关于网络的一些信息:维基百科 >> 我主要是想去了解一下telnet

没想到在右边的导航链接里面、看到了这么东西。所以、情不自禁的copy一下。

学习资料:《java 核心技术 卷Ⅱ:高级特性》

由于Windows7的telnet默认情况下是未激活的、要激活它、需要到"控制面板",选择"程序和功能",左边导航的第三个选项"打开或关闭Windows功能",在弹出的窗体中、找到telnet、勾选上后、选择确定。这样就可以激活telnet了。

在命令shell中输入telnet来启动它。 

下面利用它来与因特网主机所提供的服务进行通信、例子:

直接输入:telnet time-A.timefreq.bldrdoc.gov 13 返回的是无效指令。

我用的是Windows7 64位操作系统、输入: ?/help 后才知道、需要用open指令

输入:open time-A.timefreq.bldrdoc.gov 13

就会返回一个"当前时间"、”time-A.timefreq.bldrdoc.gov“是服务器名、这台服务器就设在美国科罗拉多州博尔德市的国家标准与技术研究所。

这家研究所负责提供銫原子种的计量时间。你会发现返回的时间好像跟你当前的电脑显示时间相差太多、因为它返回的是美国那边的时间......

13呢、是端口。

下面开始书写我的第一个Socket程序:

package com.hzw.socket.test;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;

public class MySocket {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try{
			Socket s = new Socket("time-A.timefreq.bldrdoc.gov",13); //打开一个套接字
			InputStream inS = s.getInputStream();  //获取流对象
			Scanner in = new Scanner(inS); //获取流中的数据
			while(in.hasNextLine()){
				String line = in.nextLine();  //读取数据
				System.out.println(line); //打印数据
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

打印信息:56172 12-09-02 13:39:17 50 0 0 637.3 UTC(NIST) * 

获取服务器的主机名跟因特(IP)地址:

package com.hzw.socket;
import java.net.InetAddress;
public class InetAddressTest {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try{
			/*
			 * 静态的getByName方法获取某个主机的InetAddress对象
			 */
			InetAddress addres = InetAddress.getByName("time-A.timefreq.bldrdoc.gov"); 
			System.out.println(addres);
			InetAddress Addresses = InetAddress.getLocalHost();//获取本机的InetAddress对象
			System.out.println(Addresses); 
		}catch (Exception e){
			e.printStackTrace(); 
		}
	}
}
打印信息:time-A.timefreq.bldrdoc.gov/132.163.4.101
                    pchzw-PC/192.168.0.105

实现服务器:

package com.hzw.socket.service;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class MySocketServet {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try{
			ServerSocket s = new ServerSocket(8189); //创建一个负责监听8189端口的服务
			/*
			 * 等待、直到有客户端连接到这个端口
			 * 一旦有人通过网络向该端口发送了正确的连接请求、该方法就会返回一个表示连接已经建立的Socket对象
			 * 可以使用这个对象来得到输入流和输出流
			 */
			Socket incoming = s.accept(); 
			try{
				InputStream inStream = incoming.getInputStream();  //获取输入流
				OutputStream outStream = incoming.getOutputStream(); //获取输出流
				Scanner in = new Scanner(inStream);  //创建扫描器对象
				PrintWriter out = new PrintWriter(outStream,true/*autoFlush(自动刷新)*/);
				out.println("你好、去吃屎吧!");
				boolean bone = false;
				while(!bone&&in.hasNextLine()){
					String line = in.nextLine();
					out.println("Echo:"+line);
					//如果输入数据等于BYE、则断开连接、服务器程序也终止运行
					if(line.trim().equals("BYE"))bone=true;
				}
			}catch(Exception e){
				e.printStackTrace();
			}finally{ 
				incoming.close(); //关闭套接字
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

程序写好后、可以用刚刚的第一个程序来访问该服务、也可以使用telnet去访问它。

为多个客户端服务:

package com.hzw.socket.service;

import java.io.InputStream;

import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class MyServerSocketByThread {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try{
			int i = 1;
			ServerSocket s = new ServerSocket(8189);  //创建一个负责监听8189端口的服务
			while (true){
				/*
				 * 等待、直到有客户端连接到这个端口
				 * 一旦有人通过网络向该端口发送了正确的连接请求、该方法就会返回一个表示连接已经建立的Socket对象
				 * 可以使用这个对象来得到输入流和输出流
				 */ 
				Socket incoming = s.accept();
				System.out.println("Spawning"+i); 
				/*
				 * 启动一个新的线程
				 */
				Runnable r = new ThreadEchoHandler(incoming); 
				Thread t = new Thread(r);
				t.start();
				i++;
			}
		}catch(Exception e){
			e.printStackTrace(); 
		}
	}

}
/**
 * 实现Runnable接口、与客户端通信代码
 * 
 * @author 古道西风
 *
 */
class ThreadEchoHandler implements Runnable{
	/**
	 * 构造方法
	 * @param i 连接已经建立的Socket对象 
	 */
	public ThreadEchoHandler (Socket i){
		incoming = i;
	}
	public void run() {
		try{
			try{
				InputStream inStream = incoming.getInputStream();
				OutputStream ouStream = incoming.getOutputStream();

				Scanner in = new Scanner(inStream);
				PrintWriter out = new PrintWriter(ouStream,true);  //自动刷新
				out.println("你去屎吧!");
				boolean done = false;
				while(!done && in.hasNextLine()){
					String line = in.nextLine();
					out.println("Echo:"+line);
					if(line.trim().equals("好的")) done =true;
				}
			}finally{
				incoming.close();  //关闭Socket
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	private Socket incoming;  //声明一个Socket对象、在构造方法中、给该对象赋值

}

可以打开多个telnet窗口进行测试!

................

洗澡去...................................................................

欢迎技术交流。 QQ:138986722




posted @ 2012-09-02 22:10  java程序员填空  阅读(452)  评论(0编辑  收藏  举报