java中Socket通信

[size=medium][color=blue]一.通信中常用到的命令行命令[/color][/size]

1.查看你的电脑与其他服务器的连接信息-->>netstat -an
当你在命令行中输入netstat -an 并回车后会出现如图所示的界面:


[img]http://dl.iteye.com/upload/attachment/0071/5922/754e3a31-d97f-3959-bcb9-7b5b326a755e.png[/img]

其中:
[table]
|第一列| |第二列| |第三列| |第四列|
| 协议是 TCP 还是 UDP| |本地地址由IP和端口组成| |目标机器地址由IP和端口组成| |连结状态|
[/table]

2.检查目标网站是否与本机是否可以连接也就是所谓的是否可以ping的通
当你在命令行中输入ping taobao.com(仅仅是一个例子只要ping 后面是网址或者是IP地址)
回车后会看到

[img]http://dl.iteye.com/upload/attachment/0071/5976/2fa04cee-fc7f-3dfb-876f-e87b7facbdc5.png[/img]

3.连接某网站telnet
如:telnet taobao.com 80 回车
其中taobao.com为网址也可以为IP地址 80代表端口且为默认的端口
4.查看本机与目标服务器之间经过多少服务器-->>tracert
当你在命令行中输入tracert taobao.com并回车后命令行中就会显示
途中经过多少个服务器并将服务器的IP地址输出

[img]http://dl.iteye.com/upload/attachment/0071/5978/60963ced-2c66-3cba-9b14-9ec67c33533b.png[/img]

[size=medium][color=blue]二.实现编译器向命令行发送信息[/color][/size]
代码如下:

/**
* 简单通信只实现了从代码中向命令行中发送一条信息
*
* @author:Andrew
*/
public class ChatServer(){
//主函数
public static void main(String[] args){
ChatServer chat = new ChatServer();
chat.setUpServer(8000);
}
/**
* 启动服务器
* @param port:端口
*/
private void setUpServer(int port){
try{
//建立指定端口的服务器
ServerSocket server = new ServerSocket(port);
Socket client = server.acceept();

OutputStream out = client.getOutputStream();
String str = "我的第一个通信项目";
byte[] data = str.getBytes();
out.write(data);
out.flush();
client.close();
}catch(Exception e){
e.printStackTrace();
}
}
}

运行上面的代码然后再打开命令行
输入:telnet localhost 8000
回车后即可看到命令行输出:我的第一个通信项目

如果打开命令行输入:telnet localhost 8000
回车后被告知不是内部命令
请打开"我的电脑"在搜索中搜索telnet然后将 telnet.exe
拷贝到C:\Windows\System32 目录下即可
[size=medium][color=blue]三.实现命令行与java编译软件间的通信仅以Eclipse为例[/color][/size]
代码如下:

package threadTalk;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 多个命令行聊天的入口
* @author Andrew
*
*/
public class Main {

/**
* 主程序
*/
public static void main(String[] args) {
Main m = new Main();
m.setUpServer(9090);
}
/**
* 启动一个服务器
* @param port 端口号
*/
private void setUpServer(int port){
try {
//建立服务器对象
ServerSocket server = new ServerSocket(port);
System.out.println("端口:"+port);

while(true){
Socket socket = server.accept();
ServerThread st = new ServerThread(socket);
st.start();
System.out.println("启动线程!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


package threadTalk;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
* 聊天线程类
* 功能:在命令行中实现多人聊天
* @author Andrew
*
*/
public class ServerThread extends Thread{
private Socket socket;

public ServerThread(Socket socket){
this.socket = socket;
}

public void run(){
this.sendAndGetInfo();
}
/**
* 发送并接收信息
*/
private void sendAndGetInfo(){
try {
//获得输入流对象
InputStream input = socket.getInputStream();
String s = "你好!\n";
this.sendInfo(s);

String inputStr = this.getInfo(input);
while(!"bye".equals(inputStr)){
s = "你的话语:"+inputStr+"\n";
this.sendInfo(s);
inputStr = this.getInfo(input);
}
s = "欢迎再来!";
this.sendInfo(s);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 向命令行发送信息的方法
* @param str 要发送的信息
*/
private void sendInfo(String str){
try {
OutputStream out = socket.getOutputStream();
out.write(str.getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 从另一个命令行中读取信息
* @param input 基本输入流
* @return 读取到的信息
* @throws IOException
*/
private String getInfo(InputStream input) throws IOException{
//创建字符串缓冲区
StringBuffer buffer = new StringBuffer();
//读取的字节
int read_Info = 0;
while(13 != read_Info){
read_Info = input.read();
char char_Info = (char)read_Info;
buffer.append(char_Info);
}
String str_Info = buffer.toString().trim();
return str_Info;
}
}

猜你喜欢

转载自blog.csdn.net/Andreaw/article/details/84266828