TCP通信
通过ServerSocket指定端口号,Socket访问本机,控制台简单的输出交互。
服务端
ServerSocket ss = new ServerSocket(port);
Socket s = ss.accept();
客户端
Socket s = new Socket(loaclhost,port);
下面贴出一个简单的交互实例:
package com.hz.speak;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
public class TestServer {
public static void main(String[] args) {
new TestServer().TestServerSocket();
}
public void TestServerSocket() {
DataOutputStream dos = null;
DataInputStream dis = null;
ServerSocket ss = null;
Socket socket = null;
try {
ss = new ServerSocket(10000);
socket = ss.accept();//阻塞
OutputStream os = socket.getOutputStream();
dos = new DataOutputStream(os);
InputStream is = socket.getInputStream();
dis = new DataInputStream(is);
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String info;
while(true){
info = dis.readUTF();
System.out.println("对方说:" + info);
if(info.equals("bye")){
break;
}
info = br.readLine();
dos.writeUTF(info);
if(info.equals("bye")){
break;
}
}
} catch (SocketException e) {
System.out.println("网络连接异常,程序退出!");
}catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(dos != null){
dos.close();
}
if(dis != null){
dis.close();
}
if(socket != null){
socket.close();
}
if(ss != null){
ss.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.hz.speak;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TestClient {
public static void main(String[] args) {
new TestClient().TestSocket();
}
public void TestSocket() {
DataInputStream dis = null;
DataOutputStream dos = null;
Socket socket = null;
try {
socket = new Socket("127.0.0.1", 10000);
InputStream is = socket.getInputStream();
dis = new DataInputStream(is);
OutputStream os = socket.getOutputStream();
dos = new DataOutputStream(os);
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String info;
while(true){
info = br.readLine();
dos.writeUTF(info);
if(info.equals("bye")){
break;
}
info = dis.readUTF();
System.out.println("对方说:" + info);
if(info.equals("bye")){
break;
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(dis != null){
dis.close();
}
if(dos != null){
dos.close();
}
if(socket != null){
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TCP简单的文件上传功能:
package com.hz.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class FileUploading {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(10001);
while(true){
//调用accept()方法接收客户端请求,得到Socket对象
Socket socket = serverSocket.accept();
//每当和客户端建立连接后,单独开启一个线程处理和客户端的交互
new Thread(new ServerThread(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerThread implements Runnable{
private Socket socket;
public ServerThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
String ip = socket.getInetAddress().getHostAddress();//获取客户端的地址
int count = 1;
try {
InputStream in = socket.getInputStream();
File parentFile = new File("d:\\upload\\");//创建上传图片目录的File对象
if(!parentFile.exists()){//如果不存在,就创建这个目录
parentFile.mkdir();
}
//把客户端的IP地址作为上传的文件名
File file = new File(parentFile,ip+"("+count+").jpg");
while(file.exists()){
//如果文件名存在,则把count++
file = new File(parentFile,ip+"("+(count++)+").jpg");
}
//创建
FileOutputStream fos = new FileOutputStream(file);
byte[] buff = new byte[1024];
int len = 0;
while((len = in.read(buff)) != -1){
fos.write(buff, 0, len);
}
OutputStream out = socket.getOutputStream();//获取服务器的输出流
out.write("上传成功".getBytes());
fos.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.hz.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class FileClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 10001);
OutputStream out = socket.getOutputStream();
//创建FileInputStream对象
FileInputStream fis = new FileInputStream("E:\\20160928JavaBase\\Test\\gg\\999.jpg");
byte[] buff = new byte[1024];
int len = 0;
while((len = fis.read(buff))!= -1){
out.write(buff, 0, len);
}
socket.shutdownOutput();//关闭客户端输出流
InputStream in = socket.getInputStream();
byte[] buffMsg = new byte[1024];
int num = in.read(buffMsg);//接收服务端的消息
String Msg = new String(buffMsg, 0, num);
System.out.println(Msg);
fis.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果实现界面的通信,可以参考我前面的ServerSocket+Swing+SQL Server2008聊天系统(好友私聊,聊天室群聊)此博客更加完善的讲述了带界面,类似QQ的服务端和客户端的交互!http://blog.csdn.net/qq_33624284/article/details/53581174