java 网络编程 为啥采用BufferedReader服务器读不到数据。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 网络编程 为啥采用BufferedReader服务器读不到数据。相关的知识,希望对你有一定的参考价值。

服务器:
public class Serverdemo
public static void main(String [] args) throws IOException
System.out.println("服务器启动.");
final ServerSocket ss = new ServerSocket(10000);
while(true)
final Socket s = ss.accept();
Thread t = new Thread(new Runnable()

@Override
public void run()
try
InputStream in = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));

// byte [] buf = new byte[1024];
//
// int len = in.read(buf);
// String str = new String(buf,0,len);
System.out.println("接收到::"+br.readLine());
OutputStream out = s.getOutputStream();
out.write("知道了!".getBytes());
s.close();

catch (Exception e)


);
t.start();



客户端:
public class Clientdemo
public static void main(String[] args) throws UnknownHostException, IOException
System.out.println("客户端启动.");
Socket s = new Socket("127.0.0.1", 10000);
OutputStream out = s.getOutputStream();
out.write("哥们跪了!".getBytes());
InputStream in = s.getInputStream();
byte [] buf = new byte[1024];
int len = in.read(buf);
String str = new String(buf,0,len);
System.out.println(str);
s.close();
FileWriter fileWriter = new FileWriter("mytext");
fileWriter.write(str);
fileWriter.close();


服务器用注释的代码就可以读取数据了,为什么?

1,网络编程传输的数据都是以二进制格式来传输的。

2,所以传输流第一层必须使用字节流而不能使用字符流

3,后面就可以使用BufferedReader套接在字节流外层了

例:

BufferedReader clientReader = new BufferedReader(new InputStreamReade(socket.getInputStream()));//读数据
 PrintStream  printStream = new PrintStream(socket.getOutputStream()); // 发送数据  
 
printStream.println ("xxxxxxx");发送一个带换行符的数据
clientReader.readline();//接收带换行符的数据

4,您也可以试试使用BufferedInputStream。


参考技术A 这样写吧,
BufferedReader clientReader = new BufferedReader(new InputStreamReade(socket.getInputStream()));//读数据
PrintStream printStream = new PrintStream(socket.getOutputStream()); // 发送数据

printStream.println ("xxxxxxx");发送一个带换行符的数据
clientReader.readline();//接收带换行符的数据

就可以了独到数据了额本回答被提问者采纳
参考技术B br.readLine() 是按行读取 没有收到换行符br.readLine()认为一行没结束在等换行符所以没有输出。

改用br.read()方法读读看。
参考技术C 用PrintWriter对象来写数据,通常它和BufferedReader是结合使用的,你试试 参考技术D 把bufferedReader写到request.getParameter前面试试看,先用request获取参数会截取掉bufferedReader中的数据

JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为啥没有虽然没有添加,但是ID自动增加

老师说的是:在数据库添加上面,特别是用在银行转账实例最好用事务提交,因为当这边添加语句(如转账)时遇到系统异常或是网络异常,就不会出现一个执行了,另外一边没有执行(转账的就是如果这边转账好,于到异常,但是这边又扣了,那么没有收到)。只有当两边同时正确执行才执行;一边执行,另外一边没有执行两边都不执行,自动回滚。

如下语句:我有两个插入语句,如果故意把其中一条输入错误,虽然两条都不能添加;单是我的数据表里面的id序列却自动增加了,下面的34.35.然后我错误的运行了两次,自动增加了ID主键的序列。如下图:

问题:我的id序列在数据库里面设置了自动增加和主键。怎么我下面的代码中,插入一条语句,使得我错误一条运行后,id'的序列号也不能增加!!这样才是真正的事务添加啊!!谢谢了

//通过事务提交添加属性值
private void TransactionAddGradeByName() throws Exception
Connection connection = ConnectionStart.getConnection();
System.out.println("事务添加方法数据驱动程序加载成功");
System.out.println("事务添加方法数据库连接成功!");
//关闭自动提交
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
statement.executeUpdate("insert into grade(name,score)"+"values('n9',100);");
statement.executeUpdate("insert into grade(name,score)"+"values('n10',110);");
// statement.executeBatch();//执行批量SQL语句
connection.commit();//手动提交
connection.setAutoCommit(false);
//关闭JDBC对象
ConnectionClose.close(statement,connection);
queryAll(); //

首先自增ID本来就被设计成为不参与数据库事务的,原因是什么呢?为了防止ID生成阻塞和防止ID错乱,因为对了一张表来说,不是只有你一个线程在申请ID,其他的新增线程了也在申请ID,假设你在事务中第一次申请到了ID=1,但这时你的事务并没提交,也就是这个等于1的ID现在并没有真正入库,想想这时别人的进程也去申请同一个表的ID时,ID生成器该给他1还是2?当然是2啦!如果你这时你回滚你的事务,假设事务把ID=1回滚了,给回ID生成器,ID生成器还能把它给出去别人用么?肯定不行啦,为啥,如果这时那个上次拿到2的线程这次又去拿,不是要拿到1了?说好的自增呢?!也许你会说可以等你下次申请ID时给你呀,把3给刚刚那个拿了2的呀,不好意思,数据库会话(SqlSession)一关,谁记得你呀! 参考技术A 此代码中, 没有回滚。。。。。。。追问

为什么没有回滚呀? 但是我其中一条插入语句错误,另外一条也没有执行,只是id编号自动增加了两个!不知道这算不算回滚呢?
~那如果想实现真正的回滚,连主键编号都不会增加该加入什么语句呢?

本回答被提问者采纳

以上是关于java 网络编程 为啥采用BufferedReader服务器读不到数据。的主要内容,如果未能解决你的问题,请参考以下文章

怎样使用java编程实现文件的剪切/移动

为啥要使用lambda表达式?原来如此,涨知识了

为啥 Java 没有 async/await?

JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为啥没有虽然没有添加,但是ID自动增加

网络编程Socket

用java语言开发的软件并进行销售,算侵权吗?为啥?