Socket编程——客户端,服务器端的读写操作
URL网络编程,最大的特征就是一对一的响应!
1:客户端“写”,服务器端用于“读”

package coreBookSocket2; import java.io.InputStreamReader;
import java.io.Reader;
import java.net.ServerSocket;
import java.net.Socket; /*
* 这边为服务器端的读取
*/ /*
* 1:首先建立一个ServerSocket监听在端口8888上面,服务器端只需要定义和客户端相同的端口号即可
* 2:服务器端尝试接受来自客户端的请求
* 3:和客户端连接好了之后,就可以读取来自客户端的输入信息
* 4:定义一个StringBuilder对象用来保存来自客户端的信息
* 5:关闭Reader,client,server等占用资源的对象
*/
public class clientWtiteserverOpen { public static void main(String[] args) throws Exception{
ServerSocket server=new ServerSocket(8888);
Socket client =server.accept();
Reader reader=new InputStreamReader(client.getInputStream()); //客户端获取自己的输入流
char[] ch=new char[64];
int len;
StringBuilder sb=new StringBuilder();
while( ( len=reader.read(ch) )!=-1)
{
sb.append(ch, 0, len);
}
System.out.println("From Client:"+sb);
reader.close();
client.close();
server.close();
}
}
package coreBookSocket2; import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 这边为客户端的写出
*/ /*
* 1:首先建立一个客户端的监听端口和IP地址,用相同的端口号与服务器端建立连接
* 2:从客户端向服务器端写出数据
*/
public class clientWriteserverOpen2 {
public static void main(String[] args) throws UnknownHostException, IOException { Socket client=new Socket("127.0.0.1", 8888);
Writer writer=new OutputStreamWriter(client.getOutputStream());
writer.write("Hello server");
writer.flush();
writer.close();
client.close(); } }
2:客户端先写后读,服务器端先读后写
服务器端:
package ClientAndServerWriteBoth; import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket; /*
* 服务器端的编写
* 服务器端是先读后写,那么客户端必定是先写后读
*/ public class server {
public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(6666);
Socket client=server.accept(); Reader reader=new InputStreamReader(client.getInputStream());
char[] ch=new char[20];
int len;
StringBuilder sb=new StringBuilder();
String temp;
int index; while(( len=reader.read(ch)) !=-1)
{
temp=new String(ch, 0, len);
if( (index = temp.indexOf("eof")) != -1)//遇到eof时就结束接收, 这个地方没有怎么看明白?为什么到eof就结束?
{
sb.append(temp.substring(0, index));
break;
}
sb.append(temp);
}
System.out.println("---From Client: "+sb); Writer writer=new OutputStreamWriter(client.getOutputStream());
writer.write("Hello Client I'm server! ");
writer.flush();
writer.close();
reader.close();
client.close();
server.close();
}
}
客户端:
package ClientAndServerWriteBoth; import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException; /*
* 客户端的编写,客户端先写后读
* 1:客户端设定特定的端口号与服务器端连接
*/ public class client {
public static void main(String[] args) throws UnknownHostException, IOException { Socket client=new Socket("127.0.0.1", 6666);
Writer writer=new OutputStreamWriter(client.getOutputStream());
writer.write("Hello server, I'm your father,client! 哈哈哈哈哈");
writer.flush();
//写完了开始读 Reader reader=new InputStreamReader(client.getInputStream());
char[] ch=new char[20];
int len;
StringBuffer sb=new StringBuffer();
String temp;
int index; while( (len=reader.read(ch))!=-1)
{
temp=new String(ch, 0, len);
if(( index=temp.indexOf("eof"))!=-1)
{
sb.append(temp.substring(0, index));
break;
}
sb.append(new String(ch, 0, len));
}
System.out.println("---From Server: "+sb);
writer.close();
reader.close();
client.close();
}
}
3:一个服务器端,对应多个客户端的连接
一个服务器端和多个客户端连接最好的方式就是用线程,因为服务器端接受客户端的连接的accept()方法是阻塞式的。
服务器端:
package oneServerForLotsClient; import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 这边主要是服务器的demo的编写
* 1:仍然是准备工作,让服务器端和客户端之间建立相同的端口号,实现连接。
* 2:----因为客户端那边是多个对象连接服务器端,因此需要一个死循环让服务器一直接受连接客户端的连接请求!!!
* 建立一个新的线程去处理客户端的请求
*3:服务器端首先是“读取” 客户端发送过来的信息
*/ public class Server
{
public static void main(String[] args) throws IOException
{ ServerSocket server=new ServerSocket(6868);
while(true)
{
Socket client=server.accept();
new Thread(new Task(client) ).start();
}
}
}
package oneServerForLotsClient; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
/*
* 这个类主要是用来处理新的线程,实现Runnable接口
* 1:首先定一个构造方法,主要是为了初始化client对象
* 2:同时重写run()方法,这个方法主要开启新的方法用于 “ 读” 数据,和 “写” 数据的处理
*/ public class Task implements Runnable { private Socket client; public Task(Socket client)
{
this.client=client;
} @Override
public void run() {
try {
handlerSocket();
} catch (IOException e) {
e.printStackTrace();
}
} private void handlerSocket() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
StringBuilder sb = new StringBuilder();
String temp;
int index;
while ((temp=br.readLine()) != null) {
System.out.println(temp);
if ((index = temp.indexOf("eof")) != -1) {//遇到eof时就结束接收
sb.append(temp.substring(0, index));
break;
}
sb.append(temp);
}
System.out.println("from client: " + sb);
//读完后写一句
Writer writer = new OutputStreamWriter(client.getOutputStream());
writer.write("Hello Client.");
writer.write("eof\n");
writer.flush();
writer.close();
br.close();
client.close(); } }
客户端
package oneServerForLotsClient; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException; public class Client {
public static void main(String[] args) throws UnknownHostException, IOException { Socket client=new Socket("127.0.0.1", 6868); Writer writer=new OutputStreamWriter(client.getOutputStream());
writer.write("Hello,Server. My name is client! ");
writer.write("eof\n");
writer.flush(); //写完了就开始读 BufferedReader reader=new BufferedReader(new InputStreamReader(client.getInputStream()));
StringBuffer buffer=new StringBuffer();
String temp;
int index;
while ((temp=reader.readLine()) != null) {
if ((index = temp.indexOf("eof")) != -1) {
buffer.append(temp.substring(0, index));
break;
}
buffer.append(temp);
}
System.out.println("from server: " + buffer);
writer.close();
reader.close();
client.close(); } }
Socket编程——客户端,服务器端的读写操作的更多相关文章
- socket 实现单一串口共享读写操作
		
前提:物理串口连接到PC上,通过串口号被PC唯一识别. 此时,物理串口通过该串口号仅能被单一线程或进程实例并占用,其他线程或进程不能再通过该串口号与物理串口通信.这个暂称为串口独占性. 解决思路:核心 ...
 - java socket编程 初级 服务器端和客户端 通信
		
package server; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerS ...
 - socket编程中服务器端常用函数 以及简单实现
		
1 常用函数 1.1 socket() int socket(int family, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,返回一个 ...
 - C#版 Winform界面 Socket编程 Server服务器端
		
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
 - Python socket编程客户端与服务端通信
		
[本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...
 - python--DenyHttp项目(1)--socket编程:服务器端进阶版socketServer
		
在网上看到了SocketServer模块,于是Server端简化: #coding:utf-8 import socketserver class MyTCPHandler(socketserver. ...
 - socket编程中客户端常用函数
		
1 常用函数 1.1 connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...
 - Linux的SOCKET编程详解
		
1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 U ...
 - [转]Linux的SOCKET编程详解
		
From : http://blog.csdn.net/hguisu/article/details/7445768 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在 ...
 
随机推荐
- 激活jws.mono的图像处理
			
不得不说,jws.mono真的给我们带来了很大的便利,它免除了我们编译Linux.NET所带来的烦恼,节省了我们的时间.但是金无足赤人无完人,虽然jws.mono已经大致能够提供与我们自行编译相同的效 ...
 - jieba.NET与Lucene.Net的集成
			
首先声明:我对Lucene.Net并不熟悉,但搜索确实是分词的一个重要应用,所以这里还是尝试将两者集成起来,也许对你有一参考. 看到了两个中文分词与Lucene.Net的集成项目:Lucene.Net ...
 - RxAndroid+Retrofit+MVVM(1)OKHttp
			
1)Gradlecompile 'com.squareup.okhttp:okhttp:2.4.0'compile 'com.squareup.okio:okio:1.5.0' 2)Get //创建o ...
 - 2013 duilib入门简明教程 -- 部分bug (11)
			
一.WindowImplBase的bug 在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题, 1.最大化按钮的样式 ...
 - iOS-----Crash文件分析(一)
			
开发程序的过程中不管我们已经如何小心,总是会在不经意间遇到程序闪退.脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候,流畅的操作被无情地Crash打断.联想起老罗在发布Smartisan ...
 - PowerDesigner最基础的使用方法入门学习
			
1:入门级使用PowerDesigner软件创建数据库(直接上图怎么创建,其他的概念知识可自行学习) 我的PowerDesigner版本是16.5的,如若版本不一样,请自行参考学习即可.(打开软件即是 ...
 - VS-项目发布失败的解决方案1
			
报错信息 错误 1 未能将文件 Script\easyui\themes\gray\images\Thumbs.db 复制到 obj\Release\Package\PackageTmp\Script ...
 - 专业上的常用的工具和类库集 By 老衣
			
Visual Studio 2013 扩展 CodeMaid: 可快速整理代码文件,清理不必要的代码和杂乱的格式.并在开发时实时提供代码复杂度的报告,以便帮助开发人员降低代码复杂度.提高代码质量. C ...
 - 试试看 ? 离奇古怪的javascript题目
			
来源地址: http://dmitrysoshnikov.com/ecmascript/the-quiz/#q1 另一篇帖子 看看国外的javascript题目,你能全部做对吗? http://www ...
 - HTTP协议基础
			
一.介绍 Hyper Text Transfer Protocol(超文本传输协议)主要用于从WWW服务器传输超文本到本地浏览器的传送协议.已发展到1.1版本. 二.HTTP在TCP/IP参考模型的位 ...