java网络编程Socket学习(一)

原创 2012年09月02日 22:10:58
                  

网路协议
应用层
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




版权声明:本文为博主原创文章,未经博主允许不得转载。

【Java TCP/IP Socket】TCP Socket(含代码)

协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构、交换方式、包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议、TCP协议和UDP协议。     Java为TC...
  • mmc_maodun
  • mmc_maodun
  • 2013年11月03日 17:03
  • 58067

socket文件传输示例

Server端代码: /*************************************************************************    > File Na...
  • xipiaoyouzi
  • xipiaoyouzi
  • 2015年02月06日 11:05
  • 1072

java网络编程Socket学习(一)

网路协议 应用层 DHCP · DNS · FTP · Gopher · HTTP· IMAP4 · IRC · NNTP · XMPP ·POP3 · SIP · SMTP · ...
  • yang_lyy
  • yang_lyy
  • 2015年05月13日 10:32
  • 353

Socket(网络编程)面试题

Java网络面试 1、什么是TCP协议?UDP协议?区别? TCP:传输控制协议,面向连接,可靠。保证数据传输成功。 UDP:不可靠。传输速度快。占系统资源少。 2、TCP三次握手? A——》...
  • nysyxxg
  • nysyxxg
  • 2013年04月11日 17:55
  • 6014

java网络编程Socket学习(一)

网路协议 应用层 DHCP · DNS · FTP · Gopher · HTTP· IMAP4 · IRC · NNTP · XMPP ·POP3 · SIP · SMTP · ...
  • hzw2312
  • hzw2312
  • 2012年09月02日 22:10
  • 2516

Android调用Jlibrtp库实现RTP发送数据

如果你也在Android端做RTP发送数据的话,通过网上查找资料,相信你不难发现,在使用RTP/RTCP协议发送数据是有现成的库进行调用的,Jlibrtp这个库就是Java实现的,但是这个库是没有说明...
  • EricFantastic
  • EricFantastic
  • 2015年10月23日 14:31
  • 5758

Socket网络编程学习之路 第一篇-----学习感悟

很早就开始接触了socket网络编程了,至今已经写了不少的
  • bobopeng
  • bobopeng
  • 2014年06月01日 02:09
  • 1033

JAVA网络编程之Socket用法

在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket。Socket可以看做是通信连接两端的收发器,客户端和服务店都通...
  • zhujunwang
  • zhujunwang
  • 2012年08月24日 15:56
  • 31101

Linux-(C)网络编程学习socket(初步)

3、TCP、UDP(区别) 3.1、TCP有点 3.1.1、数据可靠、不重复 3.1.2、假如数据块过大(一次发送不出去),那么tcp将会拆分成更小块数据发出去,无需程序员处理 3.2、TCP缺点...
  • qq_33850438
  • qq_33850438
  • 2016年07月28日 15:56
  • 761

java网络编程学习(一)

一 网络的分层 网络有两个分层方案,一种是传统的5层结构,另一种是ISO的7层结构 1 5层网络 (1)物理层 (2)数据链路层(PPP,Wifi,Ethernet) (3)网络层(IP,ARP) ...
  • yy_james
  • yy_james
  • 2017年05月17日 11:07
  • 106
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java网络编程Socket学习(一)
举报原因:
原因补充:

(最多只允许输入30个字)