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:Socket编程学习总结

一、网络编程中两个主要的问题         一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。         在TCP/IP协议中IP层主要负责...

java网络编程Socket学习(一)

网路协议 应用层 DHCP · DNS · FTP · Gopher · HTTP· IMAP4 · IRC · NNTP · XMPP ·POP3 · SIP · SMTP · ...

java学习小笔记(三.socket通信)

三,socket通信 1.http://blog.csdn.net/kongxx/article/details/7288896这个人写的关于socket通信不错,循序渐进式的讲解,用代码示例说明,...
  • iamkila
  • iamkila
  • 2012年02月28日 17:07
  • 5313

Dubbo实战(一)快速入门

Dubbo是什么?Dubbo[]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,...
  • FX_SKY
  • FX_SKY
  • 2016年03月30日 00:44
  • 26856

Java面试题全集(上)

2013年年底的时候,我看到了网上流传的一个叫做《Java面试题大全》的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对这个所谓的《...

java网络编程精解学习笔记(第二章 socket详解)

1 构造socket socket有几个重载的构造方法: Socket() Socket(InetAddress address, int port) //第一个参数表示主机的IP地址 Soc...
  • cg3410
  • cg3410
  • 2017年01月06日 20:06
  • 155

JAVA学习笔记Day24——javaTCP UDP网络编程Socket总结

1、Socket可以说是对网络的一种抽象,通过它可以对网络中的数据进行读写,根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的。 ...

黑马程序员--Java基础学习之网络编程(TCP、UDP、Socket、模拟发送和接收数据)

网络传输过程: 1,找到对方ip 2,数据发送到指定端口(每个应用程序对应一个端口) 3,定义通信规则,即协议   TCP/IP UDP 1,面向无连接,将数据、源、目的封装(像邮递东西) 2,数据...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java网络编程Socket学习(一)
举报原因:
原因补充:

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